具有流控制的嵌套列表理解

时间:2017-09-28 00:28:25

标签: python list-comprehension primes

我正在尝试将以下代码编写为单行代码。

for x in range(a, b+1):
   prime = True
   for y in range(2, int(x**0.5)):
     if x%y == 0:
       prime = False
       break
   if prime:
     return x

这是在a和b之间搜索素数。我将每个素数保存到一个列表中。上面的代码是检查素数范围内的每个数字。问题是我必须将这个嵌套循环编写为单行列表解析。我遇到的问题是列表理解不会经历第二个循环。它会用2来检查,然后弹出循环。

我尝试了这种方法,它失败了:          ([x for x in range(10, 21) for y in range(2, int(x**0.5)) if x%y != 0])

3 个答案:

答案 0 :(得分:2)

我会构建一个模块化结果的内部列表,并检查是否有任何零:

[x for x in range(10, 21) if 0 not in (x%y for y in range(2, int(x**0.5)))]

答案 1 :(得分:1)

如果我理解你的意图正确,你试图在一行中找到ab之间的最小素数。你有一些当前的代码,但你所展示的内容没有任何意义。我认为你试图展示的逻辑可以像这样工作:

def find_prime_between(a, b):
    for x in range(a, b+1):
        for y in range(2, int(x**0.5)):
            if x%y == 0:
                break
        else:
            return x

将此转换为单行的一种方法是使用all内置函数。它可以替换内循环,包括来自breakelse块的短循环行为。对于外循环,我建议在生成器上使用next,它获取生成器产生的第一个值:

result = next(x for x in range(a, b+1) if all(x % y != 0 for y in range(2, int(x**0.5))))

默认next如果生成器没有产生任何内容,则会引发StopIteration(因为ab之间没有素数)。如果您希望在该情况下返回其他值(例如None),则可以将其作为第二个参数传递给next。这将要求生成器表达式包含在括号中,因为它不是唯一的参数:

result = next((x for x in range(a, b+1) if all(x%y!=0 for y in range(2, int(x**0.5)))), None)

在没有滚动条的情况下,在这个答案中需要一点点压缩才能适应单行。

答案 2 :(得分:0)

Prime_numbers_list = [x for x in range(a, b+1) 
                      if all(x%y !=0 for y in range(2, int(x**0.5)))]