在Python中生成排列的子集,但不是所有排列

时间:2018-08-23 13:37:05

标签: python

我有一个列表L = [1,2,3],我想计算所有组合的乘积,但只能计算一次,即:

null # that is, no elements of the list are multiplied
1
2
3
1 * 2
1 * 3
2 * 3
1 * 2 * 3

我已经看到许多帖子谈论使用itertools,排列和组合,但是这些返回结果包括[1,2,3][2,1,3][3,2,1]等,这些不是我所追求的。 (如果知道这一点,我正在使用Python 3)

NB非常意识到这可能是我搜索技能的失败,而且我只是不知道我要寻找的确切术语。

2 个答案:

答案 0 :(得分:4)

您想要的都是所有子集。事实证明,itertools recipes提供了一种生成可迭代对象的 powerset 的巧妙方法。

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))

示例

from functools import reduce
from operator import mul

for values in powerset([1, 2, 3]):
    print(' * '.join([str(x) for x in values]),
          '=',
          reduce(mul, values, 1))

输出

 = 1
1 = 1
2 = 2
3 = 3
1 * 2 = 2
1 * 3 = 3
2 * 3 = 6
1 * 2 * 3 = 6

答案 1 :(得分:0)

您需要集合的 powerset itertools举例说明了如何找到它。

https://docs.python.org/2/library/itertools.html