Haskell 将元组列表转换为列表列表
Haskell turning list of tuples into list of lists
我正在尝试将元组列表转换为列表列表。例如,如果我有列表 [(9,1), (6,3), (4,1)]
,那么这将变成 [[9, 6, 4],[6],[6]]
。发生的事情是,在元组列表 [(a,b)]
中,a
表示 0-9 中的数字,b
表示该数字的出现,a
将始终是唯一的。
我想做的是遍历列表 n
次,其中 n = maximum b in the list of tuples.
每次我遍历列表时,我都会 a
并将其放入列表,然后将 b
减 1。如果 b == 0
那么我就跳过它。
所以在我的示例中,我将 [9,6,4]
放入一个列表中,然后递减每个的 b
,所以现在列表看起来像 [(9,0),(6,2),(4,0)]
。然后再过一遍,我取 [6]
,元组列表现在看起来像 [(9,0), (6,1), (4,0)]
。最后,最后一次 [6]
,现在元组列表中的 b
是 0
所以它完成了。
我创建了一个函数,它从元组列表中获取第一个元素当且仅当 b
是 >= 1,但我不知道如何在更新后的列表中使用所有 `b 迭代它- 每个元组 1'。
turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = []
turnIntList x = ([map (\(a, b) -> case (a,b) of _ | b >= 1 -> a | otherwise -> -1) x])
我还尝试创建另一个辅助函数,它接受一个元组列表,并根据 b
的大小将它们变成一个列表。在主函数中,我会尝试发送 [(a, 1), (b, 1)...] 来创建列表,然后在此处跟踪递减 b
直到完成。所以,对于这个函数:
pairingL :: [(Integer, Integer)] -> [Integer] -> [Integer]
pairingL ((a,b):xs) l -- = if b /= 0 then [a,b-1] else []
| null xs = if b == 1 then [a] ++ l else if b > 1 then [a] ++ l ++ pairingL [(a,b-1)] l else l
| otherwise =
if b /= 0 then [a] ++ l ++ pairingL ((a,b-1):xs) l else pairingL xs l
pairingL [(9,1), (7,2), (5,1)]
[9,7,7,5]
pairingL [(1,1), (2,1), (3,1)]
[1,2,3]
pairingL [(1,2), (2,2), (3,2)]
[1,1,2,2,3,3]
我已经尝试研究解压缩列表并使用它、迭代和重复,但我无法弄清楚如何让函数多次遍历列表并使用新的 b
值然后再去。
总之,我想做的是:
turnIntList [(9,3),(5,1),(2,1)]
[[9,5,2],[9],[9]]
turnIntList [(1,1),(2,1),(3,1),(4,1)]
[[1,2,3,4]]
turnIntList [(1,2),(2,2),(3,2)]
[[1,2,3],[1,2,3]]
turnIntList [(4,2),(6,1)]
[[4,6],[4]]
进程:
我从元组中取出第一个元素,将它们添加到列表中,然后将第二个元素减去 1。对列表中的每个元组执行此操作后,我重复该过程,直到每个元组的所有第二个元素为 0
重要说明:同样,在元组列表中 [(a,b)],a
将始终是 0-9 的唯一数字,而 b >= 0
这也许
turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = [] -- if it doesn’t compile use [[]]
turnIntList ls = [i | (i, _) <- ls] : turnIntList [(i, n - 1) | (i, n) <- ls, n - 1 > 0]
我正在尝试将元组列表转换为列表列表。例如,如果我有列表 [(9,1), (6,3), (4,1)]
,那么这将变成 [[9, 6, 4],[6],[6]]
。发生的事情是,在元组列表 [(a,b)]
中,a
表示 0-9 中的数字,b
表示该数字的出现,a
将始终是唯一的。
我想做的是遍历列表 n
次,其中 n = maximum b in the list of tuples.
每次我遍历列表时,我都会 a
并将其放入列表,然后将 b
减 1。如果 b == 0
那么我就跳过它。
所以在我的示例中,我将 [9,6,4]
放入一个列表中,然后递减每个的 b
,所以现在列表看起来像 [(9,0),(6,2),(4,0)]
。然后再过一遍,我取 [6]
,元组列表现在看起来像 [(9,0), (6,1), (4,0)]
。最后,最后一次 [6]
,现在元组列表中的 b
是 0
所以它完成了。
我创建了一个函数,它从元组列表中获取第一个元素当且仅当 b
是 >= 1,但我不知道如何在更新后的列表中使用所有 `b 迭代它- 每个元组 1'。
turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = []
turnIntList x = ([map (\(a, b) -> case (a,b) of _ | b >= 1 -> a | otherwise -> -1) x])
我还尝试创建另一个辅助函数,它接受一个元组列表,并根据 b
的大小将它们变成一个列表。在主函数中,我会尝试发送 [(a, 1), (b, 1)...] 来创建列表,然后在此处跟踪递减 b
直到完成。所以,对于这个函数:
pairingL :: [(Integer, Integer)] -> [Integer] -> [Integer]
pairingL ((a,b):xs) l -- = if b /= 0 then [a,b-1] else []
| null xs = if b == 1 then [a] ++ l else if b > 1 then [a] ++ l ++ pairingL [(a,b-1)] l else l
| otherwise =
if b /= 0 then [a] ++ l ++ pairingL ((a,b-1):xs) l else pairingL xs l
pairingL [(9,1), (7,2), (5,1)]
[9,7,7,5]
pairingL [(1,1), (2,1), (3,1)]
[1,2,3]
pairingL [(1,2), (2,2), (3,2)]
[1,1,2,2,3,3]
我已经尝试研究解压缩列表并使用它、迭代和重复,但我无法弄清楚如何让函数多次遍历列表并使用新的 b
值然后再去。
总之,我想做的是:
turnIntList [(9,3),(5,1),(2,1)]
[[9,5,2],[9],[9]]
turnIntList [(1,1),(2,1),(3,1),(4,1)]
[[1,2,3,4]]
turnIntList [(1,2),(2,2),(3,2)]
[[1,2,3],[1,2,3]]
turnIntList [(4,2),(6,1)]
[[4,6],[4]]
进程: 我从元组中取出第一个元素,将它们添加到列表中,然后将第二个元素减去 1。对列表中的每个元组执行此操作后,我重复该过程,直到每个元组的所有第二个元素为 0
重要说明:同样,在元组列表中 [(a,b)],a
将始终是 0-9 的唯一数字,而 b >= 0
这也许
turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = [] -- if it doesn’t compile use [[]]
turnIntList ls = [i | (i, _) <- ls] : turnIntList [(i, n - 1) | (i, n) <- ls, n - 1 > 0]