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

Nested List Comprehension With Flow Control

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

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])

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

[x for x in range(10, 21) if 0 not in (x%y for y in range(2, int(x**0.5)))]
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)))]

如果我正确理解了您的意图,您是在尝试在一行中找到 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 之间没有质数)。如果在那种情况下你想要它 return 一些其他值(例如 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)

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