2017-08-24 105 views
1

我試圖實現類似於Eratosthenes的Sieve。我想從集合中刪除給定範圍內的所有非素數,並將所有素數總和爲給定數。在迭代在python中迭代時刪除集合

我是新來的Python這樣的語法不熟悉

設置改變大小 -

number_set = set(list(range(1, given_number))) 
sum_number = 0 
for num in number_set: 
    if isPrime(num): 
     sum_number += num 
     prime_set = set(list(range(0, big_number, num))) 
     number_set -= prime_set 

print(sum_number) 

很顯然,我得到了錯誤。據我所知,從其他線程,我可以使用字典和使用for循環number_set.keys()(右?),但我想問,是否有可能糾正這個循環?

+0

這甚至不會工作,因爲集合是無序的,它肯定是可能的,20將在5之前排出,所以這種篩分方法將不起作用。 –

+0

沒有任何理由在把它交給設置構造函數之前將生成器轉換爲列表 – SwiftsNamesake

+0

你想在這一行調用'number_set - = prime_set'做什麼?看起來像兩組之間的差異?如果這是Python 2,也許嘗試'difference_update()'? – simplycoding

回答

1

您必須停止修改後的迭代器。 我的做法是在修改後重新啓動迭代,嘗試修改集合,例如每個已經處理的值都不會被重新處理,並且可能稱它爲一天。

您遇到的異常只是對不喜歡被同時迭代和修改的集合的限制。

number_set = set(list(range(1, given_number))) 
sum_number = 0 
done = False 

while not done: 
    for num in number_set: 
     if isPrime(num): 
      sum_number += num 
      prime_set = set(list(range(0, big_number, num))) 
      number_set -= prime_set 
      break 
    done = True 

print(sum_number) 

免責聲明:腳本可能需要你部分調整,我只是說明邏輯