Python 范围(n)和#x27的可变数量的乘积;s

Python 范围(n)和#x27的可变数量的乘积;s,python,range,product,itertools,Python,Range,Product,Itertools,我试图理解如何编写输出一个数的所有除数的代码。我最感兴趣的方法是从一个函数开始,该函数返回一个字典,其中键是素数因子,值是可除的次数。我已经这样编写了这个函数: def div_pair(num): divPair = {} for prime in prime_gen(): primeDegree = 0 while num % prime == 0: num = int(num / prime)

我试图理解如何编写输出一个数的所有除数的代码。我最感兴趣的方法是从一个函数开始,该函数返回一个字典,其中键是素数因子,值是可除的次数。我已经这样编写了这个函数:

def div_pair(num):
    divPair = {}
    for prime in prime_gen():
        primeDegree = 0
        while num % prime == 0:
            num = int(num / prime)
            primeDegree += 1
        if primeDegree > 0:
            divPair[prime] = primeDegree
        if num == 1:
            return divPair
例如,数字84000输出字典

{2: 5, 3: 1, 5: 3, 7: 1}
我想从这里做的是生成任何给定值的幂集(?),这些值由divPair将返回的不同数字组成,然后将这些幂集乘以它们匹配的素数。这是一个使用我试图用来生成功率集的代码类型的示例:

from itertools import product
list(product(range(5+1), range(1+1), range(3+1), range(1+1)))
输出如下:

[(0, 0, 0, 0),
 (0, 0, 0, 1),
 (0, 0, 1, 0),
 (0, 0, 1, 1),
 (0, 0, 2, 0),
 (0, 0, 2, 1),
 (0, 0, 3, 0),
 (0, 0, 3, 1),
 (0, 1, 0, 0),
 (0, 1, 0, 1),
 (0, 1, 1, 0),
 (0, 1, 1, 1),
 (0, 1, 2, 0),
 (0, 1, 2, 1),
 (0, 1, 3, 0),
 (0, 1, 3, 1),
 (1, 0, 0, 0),
 (1, 0, 0, 1),
 (1, 0, 1, 0),
 (1, 0, 1, 1),
 (1, 0, 2, 0),
 (1, 0, 2, 1),
 (1, 0, 3, 0),
 (1, 0, 3, 1),
 (1, 1, 0, 0),
 (1, 1, 0, 1),
 (1, 1, 1, 0),
 (1, 1, 1, 1),
 (1, 1, 2, 0),
 (1, 1, 2, 1),
 (1, 1, 3, 0),
 (1, 1, 3, 1),
 (2, 0, 0, 0),
 (2, 0, 0, 1),
 (2, 0, 1, 0),
 (2, 0, 1, 1),
 (2, 0, 2, 0),
 (2, 0, 2, 1),
 (2, 0, 3, 0),
 (2, 0, 3, 1),
 (2, 1, 0, 0),
 (2, 1, 0, 1),
 (2, 1, 1, 0),
 (2, 1, 1, 1),
 (2, 1, 2, 0),
 (2, 1, 2, 1),
 (2, 1, 3, 0),
 (2, 1, 3, 1),
 (3, 0, 0, 0),
 (3, 0, 0, 1),
 (3, 0, 1, 0),
 (3, 0, 1, 1),
 (3, 0, 2, 0),
 (3, 0, 2, 1),
 (3, 0, 3, 0),
 (3, 0, 3, 1),
 (3, 1, 0, 0),
 (3, 1, 0, 1),
 (3, 1, 1, 0),
 (3, 1, 1, 1),
 (3, 1, 2, 0),
 (3, 1, 2, 1),
 (3, 1, 3, 0),
 (3, 1, 3, 1),
 (4, 0, 0, 0),
 (4, 0, 0, 1),
 (4, 0, 1, 0),
 (4, 0, 1, 1),
 (4, 0, 2, 0),
 (4, 0, 2, 1),
 (4, 0, 3, 0),
 (4, 0, 3, 1),
 (4, 1, 0, 0),
 (4, 1, 0, 1),
 (4, 1, 1, 0),
 (4, 1, 1, 1),
 (4, 1, 2, 0),
 (4, 1, 2, 1),
 (4, 1, 3, 0),
 (4, 1, 3, 1),
 (5, 0, 0, 0),
 (5, 0, 0, 1),
 (5, 0, 1, 0),
 (5, 0, 1, 1),
 (5, 0, 2, 0),
 (5, 0, 2, 1),
 (5, 0, 3, 0),
 (5, 0, 3, 1),
 (5, 1, 0, 0),
 (5, 1, 0, 1),
 (5, 1, 1, 0),
 (5, 1, 1, 1),
 (5, 1, 2, 0),
 (5, 1, 2, 1),
 (5, 1, 3, 0),
 (5, 1, 3, 1)]
这就是我想要的结果。我只需要修改代码,以某种方式接受divPair.values()。所以我写下:

from itertools import product
divPair = div_pair(84000)
list(product(range(i+1) for i in divPair.values()))
在我看来,这似乎是正确的,但它输出了这种混乱:

[(range(0, 6),), (range(0, 2),), (range(0, 4),), (range(0, 2),)]

我想不出怎么解决它。有一篇文章为我正在尝试做的事情提供了极好的解决方案。我只是试着用我所知道的来处理它们。

product
返回其参数的乘积,并且您已经将它传递给了一个单独的变量,即divPair.values()中I的
(范围(I+1))
生成器。生成器生成了
范围
对象的列表。就像这样:

>>> list(product(['range', 'range', 'range']))
[('range',), ('range',), ('range',)]

您必须将范围作为单个参数传递

这样做:

list(product(*[range(i+1) for i in divPair.values()]))
(或本)


+嗯。你在我写的时候贴了这个。这修复了原始列表中的输入错误:
列表(产品(*[range(i+1)for i in div_pair(84000).values()])
。是的,我立即修复了输入错误,但是直到我看到你的帖子,我才注意到他没有调用
divPair
divPair
与他的函数
div\u-pair
不匹配,那么这可能是调用
div\u-pair
的结果。我现在编辑了我的打字稿,其中没有提到itertools导入产品的
,也没有提到
divPair=div\u-pair(84000)
list(product(*(range(i+1) for i in divPair.values())))