gpt4 book ai didi

python - 返回 Python 中数字列表的不同乘法组合

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:40 25 4
gpt4 key购买 nike

我有一个数字列表,我希望返回一个二维列表,最好是从最大到最小排序(虽然我可以在之后这样做),所有可能的乘法组合(产生原始列表的乘积)使用列表的所有元素,不重复。也就是说,如果我有一个 [1, 2, 3] 的列表,我希望它返回

[[3, 2, 1], [3, 2], [6, 1], [6]]

没有重复项或等效列表,如上所示([2,3] 未出现)。

这样做的原因是要找到将一个数的质因数相乘的所有方法。也就是说,从 24 (2, 2, 2, 3) 的质因数我希望它返回

[[3, 2, 2, 2], [4, 3, 2], [6, 4], [6, 2, 2], [8, 3], [12, 2], [24]]

我希望我已经说清楚了,我不确定如何正确表达这个问题。

最佳答案

一种方法可以做到这一点:使用两个嵌套循环将列表中的每个数字与其他数字相乘,然后递归到该新列表。这不是很有效,因为您将有大量重复的函数调用(例如,将 (3, 2, 2, 2) 中的 3 与三个中的任何一个相乘2,但这可以通过一些内存来帮助(不幸的是,这意味着我们必须在列表和元组之间进行大量转换)。不过,对于较大的输入,它不是很快。

def memo(f):
f.cache = {}
def _f(*args, **kwargs):
if args not in f.cache:
f.cache[args] = f(*args, **kwargs)
return f.cache[args]
return _f

@memo
def mult_comb(factors):
result = set()
result.add(tuple(sorted(factors)))
for i, f1 in enumerate(factors):
factors2 = list(factors[:i] + factors[i+1:])
for k in range(i, len(factors2)):
factors2[k] *= f1
result.update(mult_comb(tuple(factors2)))
factors2[k] /= f1
return result

示例:

>>> mult_comb((3,2,2,2))
set([(4, 6), (3, 8), (2, 12), (2, 3, 4), (24,), (2, 2, 6), (2, 2, 2, 3)])

关于python - 返回 Python 中数字列表的不同乘法组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30877856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com