如何按顺序从数组中生成所有元素的组合?

2024-04-18 23:52:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按以下顺序得到数组元素的所有组合。 说:a = [2, 3, 5],然后在我调用mysterious(a)之后,我应该得到另一个数组,即:[2, 3, 5, 2 * 3, 2 * 5, 3 * 5, 2 * 3 * 5][2, 3, 5, 6, 10, 15, 30]。注意:必须直接按此顺序。你知道吗

为了让我的问题更清楚:

  1. lst = [2, 3, 5, 7]时,返回lst应该是[2, 3, 5, 7, 2 * 3, 2 * 5, 2 * 7, 3 * 5, 3 * 7, 5 * 7, 2 * 3 * 5, 2 * 3 * 7, 2 * 5 * 7, 3 * 5 * 7, 2 * 3 * 5 * 7][2, 3, 5, 7, 6, 10, 14, 15, 21, 35, 30, 42, 70, 105, 210]

  2. 你可以认为returnList的顺序是(nCr n选择r)nC1,nC2,…,nCn。

  3. 我要求一个通用的答案,你应该处理任意长度的输入列表。

我可以应用递归算法来推导所有的组合,但是由于递归的工作方式,我只能得到[2, 3, 2 * 3, 5, 2 * 5, 3 * 5, 2 * 3 * 5] or [2, 3, 6, 5, 10, 15, 30],这是一个错误的顺序。 请参见下面的代码:

def listBuilding(lst):
    length = len(lst)
    if len(lst) == 2:
        return [lst[0], lst[1], lst[0] * lst[1]]
    else:
        previous = listBuilding(lst[:(length - 1)])
        return previous + [lst[length - 1]] + [(lst[length - 1] * x) for x in previous]

有人能帮我吗?我认为这应该是一个常见的问题,以前可能有人回答过这个问题,但我找不到。 我期待一个简单的答案。你知道吗


Tags: 答案元素lenreturn顺序数组lengthlst
1条回答
网友
1楼 · 发布于 2024-04-18 23:52:37

您可能需要将functools.reduceitertools.combinationsoperator.mul与嵌套的for循环一起使用,并在末尾添加al

>>> from functools import reduce
>>> from itertools import combinations
>>> import operator
>>> a = [2, 3, 5]
>>> l = []
>>> for i in range(2, len(a) + 1):
    for x in combinations(a, i):
        l.append(reduce(operator.mul, x, 1))


>>> a + l
[2, 3, 5, 6, 10, 15, 30]
>>> 

相关问题 更多 >