【问题标题】:Combinations of a list of list - Elementwise列表列表的组合 - Elementwise
【发布时间】:2019-03-21 16:33:45
【问题描述】:

我正在寻找一种方法来生成列表列表的所有可能组合,条件是应该只有“元素级”组合。因此,如果我们有列表 [1,2] 和 [3,4],那么结果 [3,2] 是允许的,但 [4,2] 是不允许的。使用 itertools.product(*lists) 包含最后一个结果。

因此,我想要以下输出:[1,2]、[3,2]、[1,4]、[3,4],并且应该“跳过”以下选项:[4,2] , [1,3]。注意顺序很重要!因此我不允许 [2,3],只允许 [3,2]。

我知道我可以在之后检查这一点,但由于我在我的代码中生成了许多列表,我宁愿避免这种情况。

【问题讨论】:

  • 我不明白为什么你会允许 [2,3] 而不是 [3,2]?

标签: python list combinations


【解决方案1】:

您可以将两个列表存储在一个列表列表中,然后在转置容器列表后,在其上使用itertools.product()

import itertools
original_list =  [[1,2], [3,4]]
transposed_list = list(map(list, zip(*original_list)))
print(list(itertools.product(*transposed_list)))

输出: [(1, 2), (1, 4), (3, 2), (3, 4)]

编辑 |解释如何转换列表:

根据定义,转置是交换位置的过程。

*original_list 表示[1,2][3,4]。星号指的是列表的元素,而不是整个列表

zip 基本上将值“按元素”配对: 例如对于我们的original_list,我们有[1,2][3,4]。对我们的元素调用 zip 将导致 (1,3)(2,4)。这些值是按元素配对的。 请注意,结果对不是列表形式。

map 将函数应用于输入列表中的每个元素。在我们的示例中, 我们想将(内置)list 函数应用于我们的元素对 - 即将每个对的元组转换为列表。这就是将(1,3)(2,4) 变成[1,3][2,4] 的原因

最后,将映射结果转换为包含列表,保存我们的元素对,生成[ [1,3], [2,4] ]

【讨论】:

  • 谢谢!这正是我想要的!你能解释一下第三行到底是做什么的吗?我试图用谷歌搜索它,但找不到明确的解释。
  • @StudentNL 查看更新的答案,希望能解决问题。
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多