元组的子元组

时间:2015-05-01 18:43:39

标签: python tuples

如何生成

[(0,), (1,), (2,), (0,1), (0,2), (1,2), (0,1,2)]

以编程方式(即,无需手动编写所有内容)?也就是说,元组(0,1,2)的所有非空元组的列表。

(注意这不是要求sub sets 而是要求元组。)

3 个答案:

答案 0 :(得分:5)

>>> from itertools import combinations
>>> t = (0, 1, 2)
>>> print [subset for r in range(1,4) for subset in itertools.combinations(t,r)]
[(0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]

Itertools是一个强大的资源。你应该看看documentation

答案 1 :(得分:4)

您可以使用powerset() recipe并删除空集:

from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

如下:

In [3]: [ss for ss in powerset([0,1,2]) if ss]
Out[3]: [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]

答案 2 :(得分:2)

你想要的基本上是powerset但没有空集。通过修改python itertools page中的配方,开始使用1的组合大小:

from itertools import combinations, chain

def almost_powerset(seq):
    return list(chain.from_iterable(combinations(seq, r) 
                for r in range(1, len(seq)+1)))

然后传递你的序列

lst = [0, 1, 2]
res = almost_powerset(lst)

这将生成大小为1,然后是大小为2等的所有组合,直到序列的总长度,然后使用chain连接它们。