2012-08-08 5 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

+0

また、このような2組の数列の数学用語が何であるか知っていれば、私に知らせてください。 – krushers

答えて

23

用語は "union of 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

+1

おっと、クールな答え。 Upvoteの創造的な提案 – Exelian

+1

素晴らしい、ありがとう。 – krushers