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