我想按以下顺序获取数组元素的所有组合。
说: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]
。注意:必须直接按此顺序。
为了使我的问题更清楚:
当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]
您可以想到returnList
的顺序为(nCr n选择r)nC1,nC2,...,nCn。
我要一个通用的答案,您应该处理输入列表的任意长度。
我可以应用递归算法来导出所有组合,但是由于递归的工作原理,我只能得到[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]
有人可以帮助我吗?我认为这应该是一个常见的问题,也许有人以前已经回答过,但是我找不到它。 我希望得到一个简单的答案。
答案 0 :(得分:2)
您可能需要将functools.reduce
和itertools.combinations
和operator.mul
与嵌套的for
循环一起使用,并添加a
和{{1} }:
l