我遵循了我需要转换为list-comprehension
(一个班轮)的代码。但是,我无法这样做。
该代码计算的素数最多为A
的输入范围。
def sieve(A):
l = []
f = lambda x : int(x**0.5)
for p in range(2,A+1):
for i in range(2, f(p) + 1):
if p % i == 0:
break
else:
l.append(p)
return l
到目前为止,我跟随哪些不起作用。特别是break
内的for-loop
让我失望。
list(set([val for sublist in [[p for i in range(2, f(p) + 1) if p %i != 0 ] for p in range(2,A) ] for val in sublist]))
修改
添加问题的约束。
代码只能是一个语句,没有eval
或exec
。代码最长不得超过160个字符。
答案 0 :(得分:1)
cat /etc/issue
代码长100个字符
我们使用next()来突破迭代
的说明强>
[p for p in range(2,A+1) if next((i for i in range(2, int(p**0.5) + 1) if (p % i) == 0),None)==None]
<强>输出强>
def sieve(A):
[p for p in range(2,A+1) if getFirstDiv(p)==None]
def getFirstDiv(p):
next(divIter(p),None)
def divIter(p):
return (i for i in range(2, int(p**0.5) + 1) if (p % i) == 0)
答案 1 :(得分:1)
这个班轮将会这样做:
[r for r in [i*all([i if i%j!=0 else 0 for j in range(2,i)]) for i in range(2,x)] if r>0]
您只需设置x
(最大值)。
注意:它并不是特别有效,尽管我猜测效率并不是这个问题的目的。
说明(扩展代码):
filtered = []
primes = []
for i in range(2,x):
# Check that all numbers up to i do not divide i
# I realise we only need to check up to int(sqrt(i))
condition = all([i if i%j!=0 else 0 for j in range(2,i)])
# Exploit Python's treatment of bool: number*True = number and number*False=0
filtered.append( i*condition )
for r in filtered:
# Take out all the zeros
if r>0:
primes.append(r)