gpt4 book ai didi

list - 如何将具有重复项的数组转换为具有重复项总和的数组?

转载 作者:行者123 更新时间:2023-12-01 22:19:01 25 4
gpt4 key购买 nike

所以我已经为此苦苦挣扎了几个小时。我有这个数组 [[[4,2]],[[1,2],[1,1]]] 我想把这个数组转换成 [[[ 4,2]],[[1,3]]]

所以一个函数类型为 f::[[[Integer]]] -> [[[Integer]]]

问题

我有一个内部数组长度为 2 的二维数组:[[x,y] .. ]如果内部数组的头元素重复,则内部数组是重复的:[[1,2],[1,1]]如果有重复项,我想取所有尾部的总和并创建一个新数组,其中头部作为重复值,重复项总和作为尾部值:[[1,2],[1,1 ]] 变成 [[[1,3]]

我有什么

dup [x,_] [y,_] = x == y

sample = [[[3,5],[2,3],[1,1]],
[[3,5],[2,3],[4,2],[1,2]],
[[3,5],[2,3],[4,2],[1,2]],
[[4,2],[1,2],[1,1]]]

ifDuplicateGroup = map (groupBy dup) sample

getSumOfDups n = map sum [concat $ map tail y | y <- n, (length y) > 1]

sumOfSample = map getSumOfDups sample

返回:

sumOfSample = [[],[],[],[3]]

期望的结果:

sumOfSample = 
[[[3,5],[2,3],[1,1]],
[[3,5],[2,3],[4,2],[1,2]],
[[3,5],[2,3],[4,2],[1,2]],
[[4,2],[1,3]]]`

这是我能完成的最好的工作。请帮忙!我不知道如何获得所需的结果。

最佳答案

(初步说明:如果最里面的列表总是有两个元素,您应该考虑 using pairs instead ,如 [[(4,2)],[(1,2),(1,1)] ]。这样就不必处理不可能的情况,也不必担心得到您的函数无法处理的长度错误的列表。也就是说,在接下来的内容中,我将使用您最初提出的类型。)

虽然您没有在 sumOfSample 中使用它,但您使用 ifDuplicateGroup 是在正确的轨道上:

-- I have specialised the functions to Integer; they could be more general.
-- Also note that dup is partial; it only works with lists of two elements.
-- That is the sort of issue you might avoid by using pairs.
dup :: [Integer] -> [Integer] -> Bool
dup [x,_] [y,_] = x == y

-- Making it a function by not supplying 'sample'.
ifDuplicateGroup :: [[[Integer]]] -> [[[[Integer]]]]
ifDuplicateGroup = map (groupBy dup)

ifDuplicateGroup 将为您提供一个四层嵌套列表——一个分组的双元素列表的列表。下一步是通过压缩组将其改回三重嵌套列表,从而删除重复项。这可以通过折叠来完成,通过两层映射应用(以便折叠的列表是最里面的列表组):

-- Combining function for the fold. Note that, just like dup, it is partial.
dedup :: [Integer] -> [Integer] -> [Integer]
dedup [x, acc] [_, y] = [x, acc + y]

-- foldl1' doesn't work with empty lists. That is not a problem here, given
-- that group does not produce empty (inner) lists.
sumOfSample :: [[[[Integer]]]] -> [[[Integer]]]
sumOfSample = map (map (foldl1' dedup)) . ifDuplicateGroup
-- Or, equivalently:
-- sumOfSample = map (map (foldl1' dedup) . groupBy dup)

需要注意的是 groupBy 仅对相邻元素进行分组,因此您有例如:

GHCi> sumOfSample [[[4,2],[4,4]],[[1,2],[2,1],[1,1]]]
[[[4,6]],[[1,2],[2,1],[1,1]]]

如果这是 Not Acceptable ,可以解决这个问题,尽管这可能很烦人和/或需要一些不同的方法。 (除非您不关心“中间层”内部列表中的顺序,否则您可以简单地使用 ifDuplicateGroup = map (groupBy dup .sort) sample,正如 Renezee 在评论中指出的那样.)

关于list - 如何将具有重复项的数组转换为具有重复项总和的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41478141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com