在您提出这个问题与另一个问题相似之前,请先阅读 P.P.S。
类似于this问题,我希望找到一系列因素的所有非重复组合:但是正在寻找 python 解决方案,而且前提也略有不同,我认为值得提出一个新问题。
组合函数的输入格式为[2,5,3,1,5,1,11,2]
,这是一个列表,其中奇数项是素数,甚至是他们出现的次数。该数字将为 (2^5)*3*5*(11^2) 或 58080。我的目标是打印不同因素的所有组合(在本例中为产品)。
我的尝试如下(b是我有素数的列表,div是我放置除数的空白列表(不介意1作为除数):
n=len(b)//2
a=1
if a<=n:
for i in range (n):
for g in range (1,b[2*i+1]+1):
div.append (b[2*i]**g)
a+=1
if a<=n:
for i in range (n):
for o in range (i+1,n):
for g in range(1,b[2*i+1]+1):
for h in range(1,b[2*o+1]+1):
div.append ((b[2*i]**g)*(b[2*o]**h))
这会将最多两个不同质因数的所有组合添加到列表中,但必须有一种方法可以将其继续到 n 个不同质因数的数量,而无需手动添加更多代码。但最重要的是它不会产生重复的产品。如果那里有答案,请将我重定向到它。预先感谢大家。
附注例如,取 60。60 将被函数(此处未显示)分解为 [2, 2, 3, 1, 5, 1]
。我想要的输出是 60 的所有除数,无论顺序与否,就像这样 [1,2,3,4,5,6,10,12,15,30,60]
所有组合因素的乘积。 (2,2*2,3,5,2*3,2*5,2*2*3,2*2*5,3*5,2*2*3*5(和 1,相加div 之前或之后))
P.P.S。与this的区别(另一个)问题依赖于两件事。 首先,也是最重要的,这个问题的重点不是求除数,而是求组合。除数只是它的上下文,但我想知道对于 future 的问题如何进行这样的迭代。其次,就像我在评论中所说的那样,即使是关于除数,找到素数然后将它们组合起来比寻找数字直到开方更有效(例如为什么,请参阅评论)。
最佳答案
你的 friend 是itertools
:
from itertools import product
from functools import reduce
def grow(factor, power):
#returns list [1, factor, factor^2, ..., factor^power]
array = []
for pw in range(power+1):
if pw != 0:
k *= factor
else:
k = 1
array.append(k)
return array
x = [2,2,3,1,5,1]
prime_factors = [x[i] for i in range(0, len(x), 2)]
powers = [x[i] for i in range(1, len(x), 2)]
divisor_tree = [grow(*n) for n in zip(prime_factors, powers)]
divisor_groups = product(*divisor_tree)
# returns iterator of [(1, 1, 1), (1, 1, 5), (1, 3, 1), (1, 3, 5), (2, 1, 1), (2, 1, 5), (2, 3, 1), (2, 3, 5), (4, 1, 1), (4, 1, 5), (4, 3, 1), (4, 3, 5)]
result = [reduce(lambda x,y: x*y, n) for n in divisor_groups]
print(result)
输出:
[1, 5, 3, 15, 2, 10, 6, 30, 4, 20, 12, 60]
现在我介绍一下它的作用:
- 从列表中提取
prime_factors
及其能力
zip(prime_factors, powers)
将它们相互配对grow
返回注释中的连续幂列表divisor_groups
可迭代这些列表组中的所有可能选择,每个项目均取自单独的列表reduce(lambda x,y: x*y, n)
将选定的因子元组映射到这些因子的乘积,例如(2,3,5) -> 30
编辑:
您可能希望以这种方式实现grow
,效率较低但更具可读性:
def grow(factor, power):
return [factor**i for i in range(power+1)]
关于python - 如何打印因素列表的所有非重复产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59274573/