【问题标题】:Generate each combination of one item from multiple lists [duplicate]从多个列表中生成一个项目的每个组合[重复]
【发布时间】:2013-02-13 16:19:34
【问题描述】:

我想获取数量不定、长度不定的列表,并从每个列表中生成一个元素的每个可能组合。为了提高效率,我可以简单地迭代每个组合,而不是存储结果。

例如,下面的列表列表:

[['A','B','C'],['w','x','y','z'],[1,2]]

会变成:

['A','w',1],['A','w',2],['A','x',1],['A','x',2],...,['C','z',1],['C','z',2]

不完全是 zip,也不完全是 itertools.permutation()... 如果您提前知道列表的数量,这样做很容易,但在这种情况下我不会。我确信我可以为此提供一个递归解决方案,但也许这已经解决了。有什么见解吗?

【问题讨论】:

  • 提问的方式和标题本身在这里更好;我可以轻松地用谷歌搜索这个(“重复”)问题和答案,但是在寻找与 OP 完全相同的问题的快速解决方案时,我永远不会找到“原始”。此外,这里的答案也更加明确。

标签: python list combinations


【解决方案1】:

itertools.product 是适合您的工具

>>> some_list = [['A','B','C'],['w','x','y','z'],[1,2]]
>>> list(itertools.product(*some_list))
[('A', 'w', 1), ('A', 'w', 2), ('A', 'x', 1), ('A', 'x', 2), ('A', 'y', 1), ('A', 'y', 2), ('A', 'z', 1), ('A', 'z', 2), ('B', 'w', 1), ('B', 'w', 2), ('B', 'x', 1), ('B', 'x', 2), ('B', 'y', 1), ('B', 'y', 2), ('B', 'z', 1), ('B', 'z', 2), ('C', 'w', 1), ('C', 'w', 2), ('C', 'x', 1), ('C', 'x', 2), ('C', 'y', 1), ('C', 'y', 2), ('C', 'z', 1), ('C', 'z', 2)]

几个关键点

  1. itertools.product 期望 iterables 作为参数。因此,您需要使用splat 运算符将列表作为参数传递
  2. itertools.product 返回一个生成器。您需要将其转换为列表,以转储整个内容。或者,您可以迭代它或传递给期望可迭代的函数

    for e in itertools.product(*some_list):
        print e
    

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2016-12-21
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多