使用lambda函数转换double for循环并中断到列表理解

时间:2017-10-06 03:43:10

标签: python lambda list-comprehension

我遵循了我需要转换为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]))

修改
添加问题的约束。 代码只能是一个语句,没有evalexec。代码最长不得超过160个字符。

2 个答案:

答案 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)