2017-06-18 55 views
0

我对Python很新颖,很难计算我列表中的数目相等的总和。我创建了一个数字列表(列表一),根据哥德巴赫每个数字相当于三个Primenumbers。我现在有一个所有素数组合的列表,现在我要计算list oneven中每个数字组合的数量,并将其打印出来。我尝试使用“导入集合”,由于我的代码不可排除而不起作用。然后,我累了添加了许多到上升到等于资金空单,但我得到的错误信息:在清单列表中,如何计算我在清单中的同等金额?

IndexError:列表分配索引超出范围

这里是我的代码以至极我奋力:

lijst2 = [] 
lijst = [] 
for i in oneven: 
    for a in priemgetallen: 
     for b in priemgetallen: 
      if a >= b: 
       c = i - a - b 
       if c in priemgetallen and b >= c: 
        lijst.append([c,b,a]) 
for item in lijst: 
    if sum(item) in lijst2: 
     lijst2[sum(item)] = lijst2.get(sum(item))+1 
    else: 
     lijst2[sum(item)] = 1 

for k,v in lijst2.items(): 
    print(str(k)+':'+str(v)) 

lijst2 = set(lijst) 
print(lijst2) 

柜面你有兴趣在什么,我试图做的,我试图写Goldbachs理论计数器,所以这里是我的全部代码:

oneven = [] 
for i in range(7,102,2): 
    oneven.append(i) 

priemgetallen = [2] 
counter = 3 
while priemgetallen[-1] < oneven[-1]: 
    priemgetallendelers = [] 
    for i in range (1,counter+1): 
     if counter % i == 0: 
      priemgetallendelers.append(i) 
    if len(priemgetallendelers) == 2: 
     priemgetallen.append(counter) 
     counter += 1 
    else: 
     counter +=1 

lijst2 = [] 
lijst = [] 
for i in oneven: 
    for a in priemgetallen: 
     for b in priemgetallen: 
      if a >= b: 
       c = i - a - b 
       if c in priemgetallen and b >= c: 
        lijst.append([c,b,a]) 
for item in lijst: 
    if sum(item) in lijst2: 
     lijst2[sum(item)] = lijst2.get(sum(item))+1 
    else: 
     lijst2[sum(item)] = 1 

for k,v in lijst2.items(): 
    print(str(k)+':'+str(v)) 

lijst2 = set(lijst) 
print(lijst2) 

一t结束它应该看起来有点像这样:

7 = 2 + 2 + 3 

9 = 2 + 2 + 5 
    = 3 + 3 + 3 

11 = 2 + 2 + 7 
    = 3 + 3 + 5 

13 = 3 + 3 + 7 
    = 3 + 5 + 5 

Options to write: 7, 9, 11, ...: 
1, 2, 2, 2, 3, 4, 3, 5, 5, 5, 7, 7, 6, 9, 8, 
+0

提供[mcve]。 –

+0

哦,对不起,我遗漏了 – Hendrik

+0

我已经添加了示例 – Hendrik

回答

0

有几个地方你的代码是相当低效的。首先,如果你知道你需要的素数的上限,那么Sieve of Eratosthenes是一种更有效的方式来生成素数:

def primes_sieve(limit): 
    if limit < 2: 
     return [] 
    res = [2] 
    odd_cnt = ((limit + 1)/2) 
    odd_sieve = [True] * odd_cnt 
    odd_sieve[0] = False # 1 is not a prime 
    for (i, isprime) in enumerate(odd_sieve): 
     if isprime: 
      prime = 2 * i + 1 
      res.append(prime) 
      for n in xrange(i * (prime + 1), odd_cnt, prime): # Mark factors non-prime, we can safely start at prime^2 
       odd_sieve[n] = False 
    return res 

然后用内检查if a >= b:if c in priemgetallen and b >= c:你的循环是非常低效的。使用3个嵌套循环遍历素数会更加高效,可以得到sum并将其添加到相应的“bin”中。还要记住“外层”迭代中的当前索引,并从中开始,您可以通过移除检查和迭代次数来优化代码。唯一的窍门是过滤出产生偶数的形式为[2, odd_prime, odd_prime]的三元组。恕我直言,最简单的方法就是为[2, 2, odd_prime]三联体运行一个单独的循环。

def goldbach(limit = 101): 
    primes = primes_sieve(limit) 
    primes_except_2 = primes[1:] 
    primes_len = len(primes_except_2) 

    triplets = [[] for i in xrange(limit + 1)] 

    # explicitly handle case [2,2,prime] 
    # all other cases [2, prime, prime] generate even results 
    for ci in xrange(primes_len): 
     c = primes_except_2[ci] 
     s = 4 + C# 2 + 2 + c 
     if s > limit: 
      break 
     else: 
      triplets[s].append([2, 2, c]) 

    for ai in xrange(primes_len): 
     a = primes_except_2[ai] 
     for bi in xrange(ai, primes_len): 
      b = primes_except_2[bi] 
      for ci in xrange(bi, primes_len): 
       c = primes_except_2[ci] 
       s = a + b + c 
       if s > limit: 
        break 
       else: 
        triplets[s].append([a, b, c]) 

    for k, v in enumerate(triplets): 
     if len(v) > 0: 
      print(str(k) + ':' + str(v)) 

哥德巴赫(31)产生以下输出:

7:[[2, 2, 3]]
9:[[2, 2, 5], [3, 3, 3]]
11:[[2, 2, 7], [3, 3, 5]]
13:[[3, 3, 7], [3, 5, 5]]
15:[[2, 2, 11], [3, 5, 7], [5, 5, 5]]
17:[[2, 2, 13], [3, 3, 11], [3, 7, 7], [5, 5, 7]]
19:[[3, 3, 13], [3, 5, 11], [5, 7, 7]]
21:[[2, 2, 17], [3, 5, 13], [3, 7, 11], [5, 5, 11], [7, 7, 7]]
23:[[2, 2, 19], [3, 3, 17], [3, 7, 13], [5, 5, 13], [5, 7, 11]]
25:[[3, 3, 19], [3, 5, 17], [3, 11, 11], [5, 7, 13], [7, 7, 11]]
27:[[2, 2, 23], [3, 5, 19], [3, 7, 17], [3, 11, 13], [5, 5, 17], [5, 11, 11], [7, 7, 13]]
29:[[3, 3, 23], [3, 7, 19], [3, 13, 13], [5, 5, 19], [5, 7, 17], [5, 11, 13], [7, 11, 11]]
31:[[3, 5, 23], [3, 11, 17], [5, 7, 19], [5, 13, 13], [7, 7, 17], [7, 11, 13]]

您还可以优化triplets内部goldbach的方式类似于在primes_sieve用于存储仅奇数索引(而不是存储空列表的一个甚至那些),但我没有打扰。