如何使用itertools-Python找到最小长度为N的元素组合

时间:2014-06-21 06:40:30

标签: python python-2.7 python-3.x combinations itertools

from itertools import combinations
a = [1,2,3]
combinations(a,2) #will give me ((1,2),(1,3),(2,3))
combinations(a,3) #will give me ((1,2,3),)

但如果我想要一个数组中不同长度的结果怎么办? e.g。

我想找到长度大于或等于2的给定数组[1,2,3]的所有组合 所以结果应该是((1,2),(1,3),(2,3),(1,2,3))

c = combinations(a,>=2)之类的东西 我尝试使用lambda但它无法正常工作

c = combinations(a,lambda x: x for x in [2,3])

列出全面的c = combinations(a,[x for x in [2,3]])

我知道我可以使用一个简单的循环,然后找出差异长度的组合。

for l in [2,3]:
    combinations(a,l)

但有没有任何pythonic方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以合并combinationschain.from_iterable

>>> from itertools import chain, combinations
>>> a = [1,2,3]
>>> n = 2
>>> cc = chain.from_iterable(combinations(a, i) for i in range(n, len(a)+1))
>>> list(cc)
[(1, 2), (1, 3), (2, 3), (1, 2, 3)]

chain.from_iterable这里是展平生成器表达式(combinations(a, i) for i in range(n, len(a)+1))正在生成的内容。否则你最终会得到像

这样的东西
>>> [list(combinations(a,i)) for i in range(n, len(a)+1)]
[[(1, 2), (1, 3), (2, 3)], [(1, 2, 3)]]

这很好,但不是你想要的格式。