一尘不染

Python- Eratosthenes筛网-Compact Python

algorithm

这是我使用Eratosthenes筛子查找素数的代码。

list = [i for i in range(2, int(raw_input("Compute primes up to what number? "))+1)]

for i in list:
    for a in list:
            if a!=i and a%i == 0:
                list.remove(a)

试图找到一种方法来将嵌套的for循环压缩为某种生成器或理解器,但是似乎您不能使用理解器将函数应用于列表。我尝试使用地图和过滤器,但似乎无法正确处理。

考虑这样的事情:

print map(list.remove(a), filter(lambda a, i: (a%i ==0 and a!=i), [(a, i) for i in list for a in list])

显然由于多种原因而无法使用。如果我只是使用该代码的过滤器部分:

filter(lambda a, i: (a%i ==0 and a!=i), **[(a, i) for i in list for a in list]**

将两个变量放入lambda的正确方法是什么?(a,i)使其成为一个元组,但我想将“ a”和“ i”作为独立变量提交以放入lambda。

我最终解决了这一问题:

print sorted(set([i for i in range(2, int(raw_input("Compute primes up to what number? "))+1)]).difference(a for i in l for a in l if a!=i and a%i == 0))

阅读 279

收藏
2020-07-28

共1个答案

一尘不染

这不完全是循环的直接转换,但是非常紧密和紧凑:

>>> l = range(2, 101)
>>> sorted(set(l).difference(a for i in l for a in l if a!=i and a%i == 0))
[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]

虽然我建议a > i不要a != 0短而快;)

2020-07-28