3

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

例如,以下列表列表:

[['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()... 如果您提前知道列表的数量,这样做很容易,但在这种情况下我不会。我确信我可以为此提供一个递归解决方案,但也许这已经解决了。有什么见解吗?

4

1 回答 1

10

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

    for e in itertools.product(*some_list):
        print e
    
于 2013-02-13T16:20:50.733 回答