给定一个整数变量 n,比如 3,我想获得这些组合: [1, 2, 3, 12, 13, 23, 123] 并将它们保存在列表中。 这是我写的:
cmb = []
for i in xrange(1,n+1):
for j in xrange(i,n+1):
cmb.extend(list(itertools.combinations(xrange(i,n+1),j)))
但是当我打印时,我得到了一些不需要的和重复的元组:
n = 3 : [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3), (2, 3)]
n = 4 : [(1,), (2,), (3,), (4,), (1, 2), (1, 3), (1, 4), (2, 3 ), (2, 4), (3, 4), (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4), (1, 2 , 3, 4), (2, 3), (2, 4), (3, 4), (2, 3, 4)]
n = 5 : ...
我做错了什么?
最佳答案
您的代码的问题在于您不断更改输入范围。例如,您从 [1, 2, 3]
中获取了 2 个元素,还从 [2, 3]
中获取了 2 个元素。您应该从同一范围内获取您的组合,只需更改每次获得的元素数量。为此,您不需要双循环:
import itertools
cmb = []
for i in xrange(1, n + 1):
cmb.extend(itertools.combinations(xrange(1, n + 1), i))
你也可以实现同样的事情:
from itertools import chain, combinations
n = 3
print list(chain.from_iterable(
combinations(xrange(1, n + 1), i) for i in xrange(1, n + 1)
))
输出:
[(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
关于python - 这个 for 循环生成有序非重复组合列表的错误在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29978787/