2017-08-24 64 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) 

免责声明:脚本可能需要你部分调整,我只是说明逻辑