2012-08-08 10 views
7

Pracuję nad projektem Euler Problem 5 i używam następujący:Połączyć dwie listy w wyjątkowy sposób w Pythonie

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 

Czy istnieje funkcja Python, z którym można połączyć na czynniki i czynniki jak ta funkcja działa? Na przykład, jeśli factors=[2, 3, 5] i factorization=[2, 2, 3], połączona lista powinna być [2, 2, 3, 5].

+0

projektu problemu Eulera 5: 2520 najmniejszą liczbę, która może być podzielona przez każdą z liczb od 1 do 10, bez pozostałej części. Jaka jest najmniejsza liczba dodatnia, która jest równomiernie podzielna przez wszystkie liczby od 1 do 20? – krushers

+0

Ponadto, jeśli wiesz, jakie jest matematyczne żargonowanie takiego związku dwóch zestawów liczb, proszę daj mi znać. – krushers

Odpowiedz

23

Terminologia to "unia multisets".

jest on realizowany w Pythonie pomocą collections.Counter:

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

Wow. Nie miałem pojęcia, że ​​Counter wspiera operatora '|' (gdzie to jest nawet udokumentowane?). Doskonała odpowiedź. (+1 ode mnie). – mgilson

+1

Whoa, fajna odpowiedź. Awans do kreatywnej sugestii – Exelian

+1

Niesamowite, dziękuję. – krushers