如何在 Python 中针对单个值测试多个变量以及针对多个值测试单个变量

长话短说:版本

要测试变量是否是多个值之一,请使用 in 操作员:

>>> spam = 42
>>> if spam in (3.1415, 'hello', 42, False):
...   print("spam is either 3.1415, 'hello', 42, or False")
...
spam is either 3.1415, 'hello', 42, or False

要测试多个变量之一是否是多个值之一,请使用列表理解和 any() 功能:

>>> a, b, c = 1, 42, 3
>>> any([x in (100, 3.1415, 'Hello', 42, 'cheese') for x in (a, b, c)])
True

针对单个值测试多个变量,反之亦然

在 Python 中,如果你想查看一个变量是否是许多可能值之一,你可以使用 or 运营商是这样的:

>>> spam = 42
>>> if spam == 3.1415 or spam == 'hello' or spam == 42 or spam == False:
...   print("spam is either 3.1415, 'hello', 42, or False")
...
spam is either 3.1415, 'hello', 42, or False

Python 有一个更简洁的语法,它使用 in 运算符和多个值打包在一个元组中:

>>> spam = 42
>>> if spam in (3.1415, 'hello', 42, False):
...   print("spam is either 3.1415, 'hello', 42, or False")
...
spam is either 3.1415, 'hello', 42, or False

in 运算符从字面上检查值是否在 spam 在右边的元组中 in 操作员。 此代码更具可读性,在大多数情况下,代码可读性比性能更重要。 但是使用 in 确实比系列的执行速度稍快 or 运营商。 我们可以使用 Python 的内置 timeit 模块以查看运行此代码一千万次需要多少秒:

>>> timeit.timeit("spam = 42; spam == 3.1415 or spam == 'hello' or spam == 42 or spam == False", number=10000000)
1.527424699976109

>>> timeit.timeit("spam = 42; spam in (3.1415, 'hello', 42, False)", number=10000000)
0.8834100000094622

如果你有相反的情况并且你有多个变量需要检查一个值,你可以交换 in 操作员。 所以不要使用 or 运营商是这样的:

>>> a, b, c = 3.1415, 'hello', 42
>>> if a == 'hello' or b == 'hello' or c == 'hello':
...   print("One of a, b, or c is equal to 'hello'.")
...
One of a, b, or c is equal to 'hello'.

…您可以使用 in 运营商是这样的:

>>> if 'hello' in (a, b, c):
...   print("One of a, b, or c is equal to 'hello'.")
...
One of a, b, or c is equal to 'hello'.

针对多个值测试多个变量

如果您有多个变量,并且想查看这些变量中的任何一个是否与多个值之一匹配,您可以使用列表理解和内置的 any() 功能。 让我们先花点时间了解一下这两个概念。

any() 函数接受一个列表或元组(或任何其他可迭代值)并返回 True 如果该列表中的任何值是 True. 如果列表只有 False 值或为空,则返回 False:

>>> any([False, False, True, False])
True
>>> any([True, True])
True
>>> any([False, False, False, False, False])
False
>>> any([])
False

还有一个内置的 all() 返回的函数 True 如果列表只包含 True 值,或者是一个空列表。 否则, all() 回报 False.

列表理解是一种简短的 Python 语法,用于基于另一个列表或元组(或任何其他可迭代值)创建列表值。

通常你会使用 for 循环以根据另一个列表的值创建一个新列表。 例如,我正在创建一个名为 doubles 其中包含整数 numbers 列表,但乘以 2:

>>> numbers = [3, 7, 15]
>>> doubles = []
>>> for number in numbers:
...   doubles.append(number * 2)
...
>>> doubles
[6, 14, 30]

在 Python 中编写此代码的一种更简洁的方法是使用列表推导式。 注意单行列表理解和多行列表理解之间的相似之处 for 循环代码:

>>> numbers = [3, 7, 15]
>>> doubles = [number * 2 for number in numbers]
>>> doubles
[6, 14, 30]

要检查多个变量中的任何一个是否包含多个值中的任何一个,我们可以使用列表理解和 in 运算符创建布尔列表 TrueFalse 值。 列表理解创建的布尔值列表基于变量的值是否在值元组中:

>>> a, b, c = 1, 2, 3
>>> [x in (100, 3.1415, 'Hello', 42, 'cheese') for x in (a, b, c)]
[False, False, False]
>>> b = 42
>>> [x in (100, 3.1415, 'Hello', 42, 'cheese') for x in (a, b, c)]
[False, True, False]

我们可以将这个布尔值列表传递给 any() 函数并确定是否有任何变量与任何值匹配:

>>> a, b, c = 1, 2, 3
>>> any([x in (100, 3.1415, 'Hello', 42, 'cheese') for x in (a, b, c)])
False
>>> b = 42
>>> any([x in (100, 3.1415, 'Hello', 42, 'cheese') for x in (a, b, c)])
True

将这么多代码放在一行中扩展了代码可读性的限制,但它比不使用列表推导和更简洁 any(). 没有它们,您将不得不使用嵌套 for 循环和这么多行代码,不一定更多

>>> a, b, c = 1, 2, 3
>>> match = False
>>> for variable in (a, b, c):
...   for value in (100, 3.1415, 'Hello', 42, 'cheese'):
...     if variable == value:
...       match = True
...
>>> match
False

这是完成一项简单任务的大量代码。 列表理解和 any() 方法更简洁和可读。

阅读更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注