我想要获取 1 - 1000 之间所有自然数的列表,这些自然数要么是 3 的倍数,要么是 5 的倍数。
我尝试使用列表理解:
[x for x in range(1, 1000) if x % 3 == 0 or x % 5 ==0]
这就引出了一个问题: 有没有一种很好的方法可以将 Python 列表理解的 if 子句中的许多逻辑比较串联起来?
最佳答案
我假设这是你真正的问题(强调):
Is there a nice way of stringing together many logical comparisons in the if statement of a list comprehension in Python?
您现有的代码对于两次比较来说效果很好,但如果您有 30 个比较怎么办?
实现这一点的方法是分解比较,以便您可以对它们编写理解,然后将其传递给 all
或 any
函数。
例如,如果您的代码如下所示:
[x for x in range(1, 1000)
if x % 2 == 0 or x % 3 == 0 or x % 5 == 0 or x % 7 == 0 or x % 11 == 0
or x % 13 == 0 or x % 17 == 0 or x % 19 == 0 or x % 23 == 0]
...那将是一个巨大的困惑。但你可以将其写为:
[x for x in range(1, 1000)
if any(x % i == 0 for i in (2, 3, 5, 7, 11, 13, 17, 19, 23)]
或者,当然,您可以将其分解为一个函数,这使您有机会命名事物:
primes529 = (2, 3, 5, 7, 11, 13, 17, 19, 23)
def composite529(x):
return any(x % i == 0 for i in primes529)
[x for x in range(1, 1000) if composite529(x)]
关于python - 在Python列表理解的if子句中进行多次逻辑比较的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25457015/