2013-03-11 60 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