2012-08-08 47 views
7

我工作的項目歐拉問題5和現在用的是以下幾點:合併兩個列表中獨特的方式在Python

def findLCM(k): 
start=time.time() 
primes=[2,3,5,7,11,13,17,19,23] 
factors=[] 
for factor in range(2,k): 
    if factor in primes: 
     factors.append(factor) 
    else: 
     factorization=[] 
     while factor!=1: 
      for prime in primes: 
       lastFactor=prime 
       if factor%prime==0: 
        factor/=prime 
        factorization.append(lastFactor) 
        break 
     tmpFactors=[] 
     for tmpFactor in factorization: 
      if tmpFactor not in factors: 
       factors.append(tmpFactor) 
      else: 
       tmpFactors.append(tmpFactor) 
       factors.remove(tmpFactor) 
     for tmpFactor in tmpFactors: 
      factors.append(tmpFactor) 
     print factors 
product=1 
for factor in factors: 
    product*=factor 
factors.sort() 
end=time.time() 
fnTime=end-start 
return product, fnTime, factors 

有沒有用,我可以組合分解和因素,這樣的功能做了Python的功能?例如,如果factors=[2, 3, 5]factorization=[2, 2, 3],組合列表應該是[2, 2, 3, 5]

+0

項目歐拉問題5: 2520是能夠由每個號碼而沒有任何剩餘被劃分爲1〜10的最小數目。什麼是可以被1到20的所有數字整除的最小正數? – krushers 2012-08-08 23:24:50

+0

另外,如果你知道這兩個數字集合的數學術語是什麼,請讓我知道。 – krushers 2012-08-08 23:26:38

回答

23

術語是「multisets的聯合」。

它使用collections.Counter用Python實現:

>>> from collections import Counter 
>>> combined = Counter([2, 3, 5]) | Counter([2, 2, 3]) 
>>> list(combined.elements()) 
[2, 2, 3, 5] 
+1

哇。我不知道Counter支持'|'操作符(甚至在哪裏記錄?)。明智的答案。 (從我+1)。 – mgilson 2012-08-08 23:48:11

+1

哇,很酷的答案。 Upvote的創意建議 – Exelian 2012-08-14 15:27:48

+1

真棒,謝謝。 – krushers 2012-08-15 16:34:43