2010-05-17 93 views
31

在Python中,我有一个n列表的列表,每个列表具有可变数量的元素。我怎样才能创建一个包含所有可能的排列的单个列表:Python中的一组列表的所有可能的排列组合

例如

[ [ a, b, c], [d], [e, f] ] 

我想

[ [a, d, e] , [a, d, f], [b, d, e], [b, d, f], [c, d, e], [c, d, f] ] 

注意,我不知道n的进步。我想itertools.product会是正确的做法,但它需要我预先知道的参数个数

+0

我不明白 - 为什么不计算列表来找到n? – 2010-05-17 22:07:13

+1

我能做到这一点,它对我有何帮助? – rauyran 2010-05-17 22:11:14

回答

56

你不需要要知道n提前使用itertools.product

>>> import itertools 
>>> s=[ [ 'a', 'b', 'c'], ['d'], ['e', 'f'] ] 
>>> list(itertools.product(*s)) 
[('a', 'd', 'e'), ('a', 'd', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('c', 'd', 'e'), ('c', 'd', 'f')] 
+0

是的 - Python中的参数列表可以非常方便。 – Amber 2010-05-17 22:11:11

+0

(有关参数列表的更多信息:http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – Amber 2010-05-17 22:12:09

+0

很好。我错过了如何正确使用参数列表。 – rauyran 2010-05-17 22:14:27

2

您可以用多级列表理解这样做:

>>> L1=['a','b','c'] 
>>> L2=['d'] 
>>> L3=['e','f'] 
>>> [[i,j,k] for i in L1 for j in L2 for k in L3] 
[['a', 'd', 'e'], ['a', 'd', 'f'], ['b', 'd', 'e'], ['b', 'd', 'f'], ['c', 'd', 'e'], ['c', 'd', 'f']] 
+2

这需要你事先知道'n'('n = 3'在你的回答中)的数量:) :) – badp 2010-05-17 22:10:22

+0

谢谢,但是我不知道列表的数量是多少。我有相当于[L1,L2,L3,...] – rauyran 2010-05-17 22:10:25

+0

啊好吧我不清楚你的意思是什么“知道提前论证的数量” - 我想你可能意味着列表的长度 – 2010-05-17 22:12:37

4

我itertools.product工作。

>>> l=[ [ 1, 2, 3], [4], [5, 6] ] 
>>> list(itertools.product(*l)) 
[(1, 4, 5), (1, 4, 6), (2, 4, 5), (2, 4, 6), (3, 4, 5), (3, 4, 6)] 
>>> l=[ [ 1, 2, 3], [4], [5, 6],[7,8] ] 
>>> list(itertools.product(*l)) 
[(1, 4, 5, 7), (1, 4, 5, 8), (1, 4, 6, 7), (1, 4, 6, 8), (2, 4, 5, 7), (2, 4, 5, 8), (2, 4, 6, 7), (2, 4, 6, 8), (3, 4, 5, 7), (3, 4, 5, 8), (3, 4, 6, 
7), (3, 4, 6, 8)] 
>>>