【问题标题】:With a list of lists, combine each element of each list with each other element of each other list使用列表列表,将每个列表的每个元素与其他列表的每个其他元素组合
【发布时间】:2013-01-23 03:15:55
【问题描述】:

我需要一个函数来获取(项目列表)列表,并枚举每个列表中每个项目的所有可能组合。所以

someCombo :: [[a]] -> [[a]]
someCombo = undefined

如果我有这样的事情

[ 
 [a1,b1],
 [a2,b2,c2],
 [a3,b3]
]

我想吐出这样的答案,其中每个列表的每个元素都与每个其他列表的每个元素匹配。大概在这种情况下,最终列表中会有 12 个元素。

[
  [a1,a2,a3],[a1,a2,b3],[a1,b2,a3],[a1,b2,b3],...,[b1,c2,b3]
]

主参数中可以有任意数量的列表。这看起来应该很简单,但我无法完全理解它。我可以为两个或三个列表做这件事,但我不能让它递归地工作任意数量的列表。哦,我不关心结果列表的顺序,只要我有全部 12 个(或其他)。

如果有人好奇这是做什么用的,这是我需要实现的算法的最后一部分锻炼。我认为这可能会为我每次锻炼节省几分钟。为了做到这一点,我需要列举所有可能的训练,每个训练涉及一组特定的盘子,然后找到每个举重的盘子顺序组合,从而减少洗牌次数。

【问题讨论】:

  • 你想用谷歌搜索“笛卡尔”或“外积”

标签: list haskell combinations


【解决方案1】:
import Control.Monad

someCombo = sequence

让我们试试吧:

>>> someCombo [[1, 2], [3, 4]]
[[1,3],[1,4],[2,3],[2,4]]

要理解这一点,您需要了解列表推导式或列表单子。 sequence 有效地做到了这一点:

sequence [[1, 2], [3, 4]]
= do x <- [1, 2]
     y <- [3, 4]
     return [x, y]

您可以将其想象为“让 x 范围超过 1 和 2,让 y 范围超过 3 和 4,现在返回 xy 的所有排列”。

【讨论】:

  • 枪之子。我知道我以前见过这样的事情。我会在允许的那一刻接受这个答案。
猜你喜欢
  • 2013-06-06
  • 2020-03-27
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多