2013-03-11 64 views
0

我想了解如何编写将输出数字的所有除数的代码。我最感兴趣的方法是从一个函数开始,它返回一个字典,其中键是主要因子,值是可分割的次数。我已经写了这个功能,像这样:可变数量范围(n)的产品

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} 

我想在这里做的是产生任何给定值的powersets(?)由不同的数字divPair返回将返回,然后乘以这些电源匹配的素数。这是使用那种代码的例子,我想用它来生成powersets:

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),)] 

,我无法弄清楚如何解决它。有一个帖子here,它提供了我想要做的梦幻般的解决方案。我只是试图用我所知道的方式来对付他们。

+0

现在我已经编辑我的错别字其中没有提到'从itertools导入product'也不'divPair = div_pair(84000)' – 2013-03-13 14:53:12

回答

2

product返回其参数的乘积,并且您已经通过了一个单一的生成器(range(i+1) for i in divPair.values())。生成器生成了一个range对象列表。这就像这样:

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

 

你要通过你的范围作为单独的参数。

这样做:

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

(或本)

list(product(*(range(i+1) for i in divPair.values()))) 
+0

+1嗯。你写这篇文章是我写的。这修正了原文中的错别字:'list(product(* [range(i + 1)for i in div_pair(84000).values()]))''。 – hughdbrown 2013-03-11 20:22:38

+0

是的,我立刻纠正了错别字,但没有注意到他没有叫我'divPair'直到我看到你的帖子。 – 2013-03-11 20:24:35

+0

'divPair'不匹配他的函数'div_pair' – hughdbrown 2013-03-11 20:29:29