如何迭代一个列表,以便它在迭代的第二个列表中进行交互?

时间:2017-09-29 17:46:43

标签: python python-3.x list-comprehension

这就是我所拥有的:

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

使用理解,如何将list1迭代2-10,然后除以迭代的list2,并将结果中没有零余数附加到素数?然后,我可以将列表转换为一组以删除重复项。我看到一个函数也是可能的,我只是无法理解如何编写它?

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

3 个答案:

答案 0 :(得分:3)

这是一种紧凑的方式来执行您要求的循环。但是,您的列表不应包含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的元素。但当然,有很多方法可以改善质数检测。这只是向您展示如何将理解应用于您的算法。

答案 1 :(得分:0)

尝试此操作(根据您想要的数字更改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)

但要小心,这根本不高效。一点点改进就是(number - 1)改变int(sqrt(number))。但这是数学规则。如果你想要前1000000个素数,那就不行了。如果你需要更多,你想要检查更高级的方法来找到素数。

说明: 首先使用1到10之间的所有数字进行迭代 - 1 = 9.此数字存储在变量“number”中。然后你迭代其他可能的分隔符。如果每对数字和除法器的模数为0,那么它不是素数,你可以将它标记为非素数(is_prime = False)然后退出循环。在内部循环结束时,检查布尔值is_prime,如果布尔值设置为True,则添加到列表中。

答案 2 :(得分:0)

这是查找具有列表理解的素数的一种合理有效的方法,尽管它不如我在评论中链接的Robert William Hanks的代码有效。

我们将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)