1

假设我有一个从 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

如果您将 L in 更改itertools.combinations(stuff, 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)
4

1 回答 1

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在循环中运行的事实引起的。

于 2012-05-19T15:15:46.297 回答