生成满足Python中某些约束的所有列表

时间:2014-07-02 21:13:06

标签: python list itertools

我想在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模块来完成这项工作。但是,我不知道从哪里开始,虽然我已阅读文档并查看了示例。有什么建议吗?

2 个答案:

答案 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.permutationsset(以消除重复项):

>>> 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]
>>>