如何在 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
运算符创建布尔列表 True
和 False
值。 列表理解创建的布尔值列表基于变量的值是否在值元组中:
>>> 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()
方法更简洁和可读。