所以我重新创建了eratosthenes的筛子,但是结果(素数)没有按我的预期输出。
第一个功能是筛子,该筛子返回一个字典,其中包含一个给定范围内的所有整数作为键,并且将True或False作为其值(有无素数)。此后,生成器应该获取所有值为True(质数)的密钥。我认为问题是我没有正确使用生成器(我刚刚了解了生成器),但是我无法发现错误。
from math import sqrt
def sieve(x):
values = {}
for l in range(2, x + 1):
values[l] = True
for k in range(2, int(sqrt(x)) + 1):
if values[k] == True:
for j in range(k**2, x + 1, k):
values[j] = False
return values
def primes(dict1):
for l in dict1:
if l == True:
yield list(dict1.keys())[l]
for k in primes(sieve(int(input()))):
print(k, end = " ")
我希望所有素数(词典中值为True的键)都将被打印。但是没有任何输出。
答案 0 :(得分:0)
这是更正后的版本,您可以在其中使用items()
在字典键和值上进行迭代来直接访问它们。我对代码做了一些更改:
将用户输入存储在名为number
通过遍历dict1.items()
第2点简化了原始代码中yield
的表达。
if l == True:
可以简单地替换为if value:
from math import sqrt
def sieve(x):
# function body here
def primes(dict1):
for key, value in dict1.items(): # <--- Directly access keys and values
if value:
yield key
number = int(input())
for k in primes(sieve(number)):
print(k, end = " ")
# 15
# 2 3 5 7 11 13
答案 1 :(得分:0)
Map<Integer, Integer> testMap = new HashMap<>();
遍历字典的键,并且比较for l in dict1
期望值。例如,您可以通过使用if l==True
遍历键和值来解决此问题:
items
一些不相关的注释:
您可能想使用布尔值列表(甚至是array
)来存储筛分数据。使用键为连续数字的字典很浪费。
在测试布尔值时,请使用for n, isprime in dict1.items():
if isprime:
yield n
而不是if x
。对于if x == True
以外的真实值,例如1或非空容器,后者将给出错误的答案。 (要测试True
是否为假,请使用x
。)
答案 2 :(得分:0)
使用for l in dict1
对字典进行迭代会产生键,而不是 values 。
因此if l == True
永远都不是。