如何迭代一个列表,使其在迭代的第二个列表中交互?

2024-04-25 01:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是我所拥有的:

list1 = range(2, 11)
list2 = range(2, 11)
primes = []
primes.append(?)
? % ? == 0....
primes = set(primes)

使用理解,我怎么能把list1迭代2-10,再除以一个迭代的list2,结果不带零余数附加到素数上?然后我可以将列表转换为一个集合来删除重复项。我看到一个函数也是可能的,我只是不能让我的大脑思考如何写它?你知道吗

期望的结果是。 素数=[2,3,5,7]


Tags: 函数列表range素数primes大脑setappend
3条回答

这里有一个相当有效的方法来找到具有列表理解的素数,尽管它没有我在评论中链接的robertwilliamhanks的代码那么有效。你知道吗

我们把2当作一个特例,所以我们不需要为更高的偶数而烦恼。我们只需要检查小于我们测试的数字的平方根的因子。你知道吗

from math import floor, sqrt

primes = [2] + [i for i in range(3, 100, 2) 
    if all(i % j != 0 for j in range(3, 1 + floor(sqrt(i)), 2))]
print(primes)

输出

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

这里有一个替代的(效率较低的)版本,它在list1上迭代(它实际上不是一个列表,而是一个range对象)。你知道吗

list1 = range(2, 100)
primes = [i for i in list1 if not [j for j in list1 if j*j <= i and i % j == 0]]
print(primes)

这里有一个紧凑的方法来完成你要求的循环。但是,您的列表不应包含1。你知道吗

>>> list1 = list(range(2,11))
>>> list2 = list(range(2,11))
>>> primes = [a for a in list1 if all((a % b) != 0 for b in list2 if a != b) ]
>>> primes
[2, 3, 5, 7]

结果中没有重复项,因为理解只收集list1的元素。当然,有很多方法可以改进素数检测。这只是向您展示了如何将理解应用于您的算法。你知道吗

试试这个(按你想要的数字改10)

primes = []
for number in range(1,10):
    is_prime = True
    for div in range(2, number-1):
        if number % div == 0:
            is_prime = False
            break
    if is_prime:
        primes.append(number)

不过,要小心,这一点效率都不高。一个小小的改进就是用int(sqrt(number))来改变(number - 1)。但这是数学规则。如果你想要前1000000个素数,那是行不通的。如果你需要的话,你可能想检查更高级的方法来找到素数。你知道吗

说明: 你首先迭代所有在1到10之间的数字-1=9。此数字存储在变量“number”中。然后迭代其他可能的除数。如果每对数字和除法器的模为0,则它不是素数,可以将其标记为非素数(is\u prime=False),然后退出循环。在内部循环的末尾,检查布尔值是否为素数,如果布尔值设置为True,则将其添加到列表中。你知道吗

相关问题 更多 >