python - 如何打印因素列表的所有非重复产品

标签 python python-3.x list combinations

在您提出这个问题与另一个问题相似之前,请先阅读 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/

相关文章:

python - 我需要读取 CSV 文件,然后写入一个包含 0 个重复项的新 CSV 文件

python optparse 如何设置列表的参数?

python - 按钮和文字闪烁

python - Gurobi Python API : model. addVars() 太慢

java - 将List转换为InputStream而不创建中间文件

list - 如何在 Prolog 中查找列表中的反转次数

python - 关于 Flask 和导入模块的困惑

python - 我的 Flask 应用程序无法在树莓派上正确提供视频,但在我的笔记本电脑上正常

java - 从 Arraylist<String> 中获取恰好出现三次的字符串

python - 如何从模板外部在 Pyramid 中注册全局 mako 函数?