繁体   English   中英

条件列表理解

[英]Conditional list comprehension

我试图更好地理解列表推导如何工作。 我有以下函数返回true或false如果一个数字是素数(我在论坛的某个地方找到但不记得在哪里):

import math

def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

如果我跑:

[x for x in range(2, num) if is_prime(x)]

我得到了理想的结果

[2, 3, 5, 7, 11, 13, 17, 19]

在尝试将整个函数转换为列表理解时,我提出了:

[x if not (x%2==0 and x > 2) else x for x in range (2, num) 
     for i in range(3, int(x**(1/2))+1, 2) if not (x%i==0)]

产生:

[10, 11, 13, 14, 16, 17, 19]

不知道我哪里出错了,并希望得到一些帮助。 事实上,我觉得在这种情况下使用函数会更好,但就像我说的那样,我试图理解列表理解及其功能。

你可以这样做:

[n for n in range(2, num) if n % 2 != 0 and n > 2 and all(n % i != 0 for i in range(3, int(math.sqrt(n)) + 1, 2))]

虽然只是为了它的一个班轮不一定是好事。 IMO使用像你这样的主要测试仪功能更好......

注意:在您的尝试中不起作用的是您修改了外部列表理解的逻辑。 你仍然想要一个像[n for n in range(...) if (expression testing if n is prime)]

主要问题是你正在进行复杂的翻译。 尝试简化原始条件,以便返回“x if x == 2,else x ...”,就像您已经完成的那样。 我只是在这里给你一个领先的暗示; 从你已经完成的事情来看,我认为你可以搞清楚。

如果没有,请尝试简化“else”表达式,以便了解该子句的逻辑。 然后我相信你会明白的。 你表现得很好。

1/2以上的代码中存在逻辑错误,评估为0,而不是0.5。 要做到这一点,要么使用0.5或1 / 2.0或1.0 / 2

此外,它不会照顾2作为一个特例。 as (for i in range(3, int(x**(1/2.0))+1, 2) if not (x%i==0))则不执行

for i in range(3, int(x**(1/2.0))+1, 2) if not (x%i==0)也是一个逻辑错误,因为只要这个条件为真,就会导致多个条目加上

正确的方法是

[x for x in range (2, num) if x == 2 or (x > 2 and x % 2 == 1 and len([i for i in range(3, int(x**(1/2.0))+1, 2) if x%i == 0 ])==0)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM