具有流控制的嵌套列表理解
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)))]
如果我正确理解了您的意图,您是在尝试在一行中找到 a
和 b
之间的最小素数。您有一些当前代码,但您所展示的内容没有任何意义。我认为您试图展示的逻辑可以像这样工作:
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
内置函数。它可以替代内部循环,包括来自 break
和 else
块的短路行为。对于外部循环,我建议在生成器上调用 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
(因为 a
和 b
之间没有质数)。如果在那种情况下你想要它 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)
在没有滚动条的情况下,这需要一点点挤压才能适合这个答案中的一行。
我正在尝试将以下代码编写为单行代码。
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)))]
如果我正确理解了您的意图,您是在尝试在一行中找到 a
和 b
之间的最小素数。您有一些当前代码,但您所展示的内容没有任何意义。我认为您试图展示的逻辑可以像这样工作:
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
内置函数。它可以替代内部循环,包括来自 break
和 else
块的短路行为。对于外部循环,我建议在生成器上调用 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
(因为 a
和 b
之间没有质数)。如果在那种情况下你想要它 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)
在没有滚动条的情况下,这需要一点点挤压才能适合这个答案中的一行。