2016-03-18 65 views
1

当我尝试计算如何在Python中获取列表列表的所有排列和组合时,我的大脑将会爆炸。问题是写这将以下输入列表[['I1', 'I2', 'I3'], ['I2', 'I3']]返回以下功能:Python itertools获取排列和列表列表的组合

[['I1', 'I2', 'I3'], ['I2', 'I3']] 
[['I1', 'I3', 'I2'], ['I2', 'I3']] 
[['I2', 'I1', 'I3'], ['I2', 'I3']] 
[['I2', 'I3', 'I1'], ['I2', 'I3']] 
[['I3', 'I1', 'I2'], ['I2', 'I3']] 
[['I3', 'I2', 'I1'], ['I2', 'I3']] 
[['I1', 'I2', 'I3'], ['I3', 'I2']] 
[['I1', 'I3', 'I2'], ['I3', 'I2']] 
[['I2', 'I1', 'I3'], ['I3', 'I2']] 
[['I2', 'I3', 'I1'], ['I3', 'I2']] 
[['I3', 'I1', 'I2'], ['I3', 'I2']] 
[['I3', 'I2', 'I1'], ['I3', 'I2']] 
[['I2', 'I3'], ['I1', 'I2', 'I3']] 
[['I2', 'I3'], ['I1', 'I3', 'I2']] 
[['I2', 'I3'], ['I2', 'I1', 'I3']] 
[['I2', 'I3'], ['I2', 'I3', 'I1']] 
[['I2', 'I3'], ['I3', 'I1', 'I2']] 
[['I2', 'I3'], ['I3', 'I2', 'I1']] 
[['I3', 'I2'], ['I1', 'I2', 'I3']] 
[['I3', 'I2'], ['I1', 'I3', 'I2']] 
[['I3', 'I2'], ['I2', 'I1', 'I3']] 
[['I3', 'I2'], ['I2', 'I3', 'I1']] 
[['I3', 'I2'], ['I3', 'I1', 'I2']] 
[['I3', 'I2'], ['I3', 'I2', 'I1']] 

任何想法如何有效地使它在Python?谢谢!

P.S.函数应该返回任何规模的名单输入列表中的所有排列和组合,上述

回答

1

所示不仅仅是两个元素的列表作为一款全功能的方法,您可以使用permutations()product()chain()功能从itertools模块和内置在功能map()

>>> from itertools import permutations, product, chain 
>>> def my_prod(lst): 
...  return product(*map(permutations, lst)) 
... 
>>> 
>>> list(chain(*map(my_prod, permutations(lst)))) 
[(('I1', 'I2', 'I3'), ('I2', 'I3')), (('I1', 'I2', 'I3'), ('I3', 'I2')), (('I1', 'I3', 'I2'), ('I2', 'I3')), (('I1', 'I3', 'I2'), ('I3', 'I2')), (('I2', 'I1', 'I3'), ('I2', 'I3')), (('I2', 'I1', 'I3'), ('I3', 'I2')), (('I2', 'I3', 'I1'), ('I2', 'I3')), (('I2', 'I3', 'I1'), ('I3', 'I2')), (('I3', 'I1', 'I2'), ('I2', 'I3')), (('I3', 'I1', 'I2'), ('I3', 'I2')), (('I3', 'I2', 'I1'), ('I2', 'I3')), (('I3', 'I2', 'I1'), ('I3', 'I2')), (('I2', 'I3'), ('I1', 'I2', 'I3')), (('I2', 'I3'), ('I1', 'I3', 'I2')), (('I2', 'I3'), ('I2', 'I1', 'I3')), (('I2', 'I3'), ('I2', 'I3', 'I1')), (('I2', 'I3'), ('I3', 'I1', 'I2')), (('I2', 'I3'), ('I3', 'I2', 'I1')), (('I3', 'I2'), ('I1', 'I2', 'I3')), (('I3', 'I2'), ('I1', 'I3', 'I2')), (('I3', 'I2'), ('I2', 'I1', 'I3')), (('I3', 'I2'), ('I2', 'I3', 'I1')), (('I3', 'I2'), ('I3', 'I1', 'I2')), (('I3', 'I2'), ('I3', 'I2', 'I1'))] 

这里map函数映射在你的子列出了permutations然后product将创建置换的产品。

的另一种方式(稍微快),你可以用一个列表理解,而不是map()

>>> def my_prod(lst): 
...  return product(*[permutations(sub) for sub in lst]) 
+0

对不起,也许我的问题是不明确的,但在你的答案适用于在问题中给出的输入列表,它不会返回列表的较长列表的所有排列和组合,例如'[['I1','I2','I3'],['I2','I3'],['I5',' I6']]' – madprogrammer

+0

@madprogrammer是的,检出编辑。 – Kasramvd