2017-06-14 30 views
0

我是一般的編程新手,我試圖在Python中使用「Goldbach Theorie」,每個數字在3和給定數字之間(在我的情況50)獲取代碼以停止將列表添加到另一個列表,如果它的總和已經存在

lijst2 = [] 
for n in lijst: 
    j = 2*n+1 
    lijst2.append(j) 


priemgetallen = [2] 
counter = 2 
x = 2 
while len(priemgetallen)<50: 
    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 

上面的代碼是不重要的我的問題,只是在那裏更容易瞭解我試圖做的。

while not len(sommen) == len(lijst2): 
    for i in lijst2: 
     for j in priemgetallen: 
      for r in priemgetallen: 
       for t in priemgetallen: 
        if i == j+r+t: 

在這裏,我想說,如果我的原始列表中的數字是由三個素數總和組成的,請將其添加到列表中。

     sommen2 = [] 
         sommen2.append(j) 
         sommen2.append(r) 
         sommen2.append(t) 

所以直到這裏的一切接縫的工作,但如果我讓它打印出來的輸出,我得到了幾次相同的「我」或者說從質數相同的總和。

     for q in sommen: 
          if not sum(sommen2) == sum(q): 
           sommen.append(sommen2) 

這裏我想說的是,如果q的總和已經存在,請不要再添加一個。 Bu代替我的筆記本計算很長一段時間。

print (sommen) 

回答

1

問題是你的循環。由於循環將[1, 7, 5]視爲與[5, 7, 1]不同,因此與[7, 5, 1]等不同,所以您不止一次返回相同的款項。

清理循環是這個。

import itertools 

l = [10, 15, 4, 2, 7, 20] 

p = [1, 2, 3, 5, 7, 11, 13] 

sommen = [] 

for v in map(lambda x: sum(x), itertools.combinations(p, 3)): 
    if v in sommen: 
     pass 
    elif v in l: 
     sommen.append(v) 

print sommen 

>> [10, 15, 20] 

正如預期

  2 + 3 + 5 = 10 
      3 + 5 + 7 = 15 
      2 + 7 + 11 = 20 

注意,1 + 2 + 7還給出了10,但10未添加兩次

注意,2 + 5 + 13還給出了20,但是20不添加兩次

編輯:如果你想看到,在這個怎麼樣去的因素:

for combo in itertools.combinations(p, 3): 
    if sum(combo) in map(lambda x: x[0],sommen): 
     pass 
    elif sum(combo) in l: 
     sommen.append([sum(combo), combo]) 

print sommen 

>> [[10, (1, 2, 7)], [15, (1, 3, 11)], [20, (2, 5, 13)]] 
+0

爲什麼'lambda x:sum(x)'當你可以使用'sum'?此外,「輸出」有點誤導 - 這不能是程序的實際輸出嗎?它不會以目前的形式找到實際的分解。 Upvoted for itertools' – Pigpag

+0

@Pigpag編輯的解決方案,將顯示哪些因素進入總和。 –

+0

我想用你的選擇,因爲它是可以理解的,但在我的情況下,它是一個我不允許導入Itertools的練習 – Hendrik

0

先回答你原來的問題:

問題在於這樣一個事實,你只有一個項目sommen2檢查時重複整個sommen。假設sommen包含9個值,其中一個等於sommen2的總和,您仍然追加sommen2 8次。

我會用字典,全面改寫你的程序,就像這樣:

sum_summands = dict() 
# found a candidate i=j+r+t here 
sum_summands[i] = (j,r,t) #use tuple not list 
# or if you want to always keep the first candidate you've found 
if i not in sum_summands: # don't overwrite if sum i already exists 
    sum_summands[i] = (j,r,t) 

有一噸的,你可以在你的算法優化其他的事情。讓我指出最明顯的一個。而不是這樣做 -

for i in lijst2: 
    for j in priemgetallen: 
     for r in priemgetallen: 
      for t in priemgetallen: 
       if i == j+r+t: 

你爲什麼不擺脫最內層的環 -

for i in lijst2: 
    for j in priemgetallen: 
     for r in priemgetallen: 
      if i-j-r in priemgetallen: 

這是毫無意義的遍歷一個巨大的數字的名單只是爲了檢查,如果他們加起來一定數量 - 你應該做一些最低水平的數學來簡化事情。

0

的問題是下面的代碼:

    for q in sommen: 
         if not sum(sommen2) == sum(q): 
          sommen.append(sommen2) 

如果我理解正確,你要添加sommen2到sommen如果總和是不是已經在sommen。但是你所做的是,你把它加到索曼的每一個與索馬里人的總和不相同的元素上。用下面的代碼代替:

    if not any(sum(sommen2) == sum(q) for q in sommen): 
         sommen.append(sommen2) 
相關問題