我想在Python中生成以下列表:
[1, 1, 1, 2, 2]
[1, 1, 2, 1, 2]
... etc
[2, 1, 2, 1, 1]
[2, 2, 1, 1, 1]
任何列表中总有两个" 2" s和三个" 1&#34 ;.
我的直觉表明我需要使用itertools模块来完成这项工作。但是,我不知道从哪里开始,虽然我已阅读文档并查看了示例。有什么建议吗?
答案 0 :(得分:2)
您可以注意到,此类列表的数量等于以长度为5的顺序放置两个" 2"的方式。这表明以下解决方案:
n = 5 # total length
n2 = 2 # number of "2"s
for idx in itertools.combinations( xrange(n), n2 ):
print [ 2 if i in idx else 1 for i in xrange(n) ]
很容易看出使用排列的答案是迭代n!
解决方案,而我的解决方案迭代n!/( (n-n2)! * n2!)
。例如,如果输入列表是[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]
,则使用排列的解决方案会慢〜90,000,000倍(10!* 4!)
答案 1 :(得分:1)
您可以使用itertools.permutations
和set
(以消除重复项):
>>> from itertools import permutations
>>> for combo in set(permutations([1, 1, 1, 2, 2])):
... print(list(combo))
...
[1, 2, 1, 1, 2]
[2, 1, 1, 1, 2]
[2, 1, 2, 1, 1]
[2, 1, 1, 2, 1]
[1, 1, 2, 1, 2]
[1, 1, 1, 2, 2]
[1, 2, 1, 2, 1]
[1, 1, 2, 2, 1]
[1, 2, 2, 1, 1]
[2, 2, 1, 1, 1]
>>>
如果需要按顺序组合,则可以使用sorted
:
>>> for combo in sorted(set(permutations([1, 1, 1, 2, 2]))):
... print(list(combo))
...
[1, 1, 1, 2, 2]
[1, 1, 2, 1, 2]
[1, 1, 2, 2, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 2, 1]
[1, 2, 2, 1, 1]
[2, 1, 1, 1, 2]
[2, 1, 1, 2, 1]
[2, 1, 2, 1, 1]
[2, 2, 1, 1, 1]
>>>