首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用lambda函数将双for循环转换为列表理解

用lambda函数将双for循环转换为列表理解
EN

Stack Overflow用户
提问于 2017-10-06 03:43:10
回答 2查看 2K关注 0票数 1

下面是我需要转换为list-comprehension (一个班轮)的代码。不过,我不能这样做。该代码将素数计算到A的输入范围。

代码语言:javascript
复制
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

到目前为止,我已经跟踪了不起作用的。尤其是for-loop内部的for-loop让我失望了。

代码语言:javascript
复制
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个字符长。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-06 04:24:12

代码语言:javascript
复制
[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]

代码有100个字符长。

我们使用下一次()来打破迭代。

解释

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
15 --> [2, 3, 5, 7, 11, 13]
10 --> [2, 3, 5, 7]
票数 1
EN

Stack Overflow用户

发布于 2017-10-06 04:29:28

这个班轮就能做到:

代码语言:javascript
复制
[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 (最大值)。

注意:虽然我猜效率不是这个问题的目的,但它并不特别有效。

解释(扩展代码):

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46597939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档