是否有一种有效的方法只能获得列表的K组合?

时间:2012-05-19 15:06:48

标签: python algorithm

假设我有一个简单的列表,从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)

1 个答案:

答案 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这一事实造成的。