在N个列表中查找共同的n个数字

时间:2015-06-19 12:32:43

标签: python primes intersection

我正在尝试解决这个问题(来自Project Euler)。

  

素数3,7,109和673非常值得注意。通过采取任何两个   以任何顺序连接和连接它们,结果将始终如一   主要。例如,取7和109,7109和1097都是素数。   这四个素数的总和,792,代表一组的最低总和   这个属性的四个素数。

     

找到任意两个素数的五个素数的最小和   连接以产生另一个素数。

对于复制场景,考虑到4个素数(3,7,109,673)的事实

  1. 673是最高数字,以673109为上限
  2. 我用Sera of Erathosenes生成素数直到700000并将其存储在一个列表中。

    导出素数至700,并将其存储在另一个列表中。

    现在,

    l = [3,5,7,11 ...] -- till 700
    primes = [3,5,.....] - till 700000
    

    现在,我通过添加前缀和后缀,将列表中的每个数字与其他素数进行比较。

    Take,3并将其与5进行比较。 35和53不是素数。然后与7比较。 37和73是素数。因此将7插入列表。

    3的循环结束,插入到字典中,其中3为键,列表中的3与列表中的3属性匹配为Value。我还将键值添加到列表中。

    因此,我最终得到了像这样的字典

    key : 3 , Value : 3, 7, 11, ..., 109 , ... 673 
    key : 7 , Value : 3, 7, 11, .., 109, 673
    key : 11, Value : ......
    ..
    ..
    .. 
    key 673 , Value : 3,7, .. 109, 673 
    

    现在,我有123个列表,其中只有4个列表有3,7,109和673.

    如何检索这些列表中的公共号码?

    我不知道如何比较匹配元素的4个列表。

    但是,如果有一些方法可以导出4个列表中常见的4个数字,那么我就解决了Project Euler问题。我可以通过增加上限为5个数字应用相同的逻辑。

    我目前的代码:

       def eratosthenes2(n):
        multiples = set()
        for i in range(2, n+1):
            if i not in multiples:
                yield i
                multiples.update(range(i*i, n+1, i))
    
    primes = list(eratosthenes2(700000))
    
    def isReversedPrime(m,n):
        if( int( str(m) + str(n) ) in primes and int( str(n) + str(m) ) in primes ):
            return True
        else:
            return False
    
    f1 = open('logs.txt', 'w+')
    
    
    toCheck = list(eratosthenes2(700))
    #toCheck = [ i for i in range(2,700)]
    d = {}
    
    print "Total Elements " , len(toCheck)
    for i in range(len(toCheck)):
        print "Checking for ", toCheck[i], " iteration ", i
        l = []
        for j in range(len(toCheck)):
            if isReversedPrime(toCheck[i], toCheck[j]) == True :
                l.append(toCheck[j])
        #print toCheck[i] , " has " , len(l), " elements "
        if len(l) > 0:
            d[toCheck[i]] = l
        #print "\n"
    

1 个答案:

答案 0 :(得分:2)

您可以使用set.intersection查找常用元素。

>>> list1 = set([1,2,3,4])
>>> list2 = set([2,3,4,5])
>>> list3 = set([3,4,5,6])
>>> lists = [list1, list2, list3]
>>> set.intersection(*lists)
set([3,4])