假设我有一个简单的列表,从1到8,只需要包含7个字符的组合。我怎么能有效地做到这一点?是否可以在不重复整个列表的情况下完成它?
例如,这将完成整个列表:
import itertools
stuff = [1, 2, 3,4,5,6,7,8]
count = 0
for L in range(0, len(stuff)+1):
for subset in itertools.combinations(stuff, L):
print(subset)
count = count + 1
print count #returns 256 results with 8 matching the 7 length
如果你将itertools.combinations(stuff, L):
中的L更改为7然后它可以工作,但它会给你很多重复(72个结果,大多数是重复的)。我知道我可以从上面的代码中提取我想要的7个项目但是对于更大的列表,我这样做似乎效率低下。有什么建议吗?
在这种情况下,我正在寻找的最终结果是:
(1, 2, 3, 4, 5, 6, 7)
(1, 2, 3, 4, 5, 6, 8)
(1, 2, 3, 4, 5, 7, 8)
(1, 2, 3, 4, 6, 7, 8)
(1, 2, 3, 5, 6, 7, 8)
(1, 2, 4, 5, 6, 7, 8)
(1, 3, 4, 5, 6, 7, 8)
(2, 3, 4, 5, 6, 7, 8)
答案 0 :(得分:11)
itertools.combinations
效果很好:
>>> for c in itertools.combinations(stuff, 7):
... print(c)
...
(1, 2, 3, 4, 5, 6, 7)
(1, 2, 3, 4, 5, 6, 8)
(1, 2, 3, 4, 5, 7, 8)
(1, 2, 3, 4, 6, 7, 8)
(1, 2, 3, 5, 6, 7, 8)
(1, 2, 4, 5, 6, 7, 8)
(1, 3, 4, 5, 6, 7, 8)
(2, 3, 4, 5, 6, 7, 8)
重复项是由于您在循环中运行combinations
这一事实造成的。