Python中的多个“或”条件

27 投票
2 回答
123882 浏览
提问于 2025-04-17 21:39

我遇到了一点代码问题,在IDLE里能正常运行,但在Eclipse里不行。我可以这样写:

if  fields[9] != ('A' or 'D' or 'E' or 'N' or 'R'):

而不是这样写:

if  fields[9] != 'A' and fields[9] != 'D' and fields[9] != 'E' and fields[9] != 'N' and fields[9] != 'R':

谢谢。

2 个回答

15

你想要使用 in 操作符:

if fields[9] not in 'ADENR':
    ...

或者,你可以用 any

if not any(fields[9] == c for c in 'ADENR'):
    ...

或者,另外一种选择是 all,它的形式可能和原来的稍微相似:

if all(fields[9] != c for c in 'ADENR'):
    ...

顺便提一下:

if x != ('A' or 'B' or 'C'):

这实际上和说:

if x != 'A':

是一样的,因为 'A' or 'B' or 'C' 计算结果是 'A'(你可以试试!)。原因是,使用 or 时,python 会返回第一个“非假值”的结果(如果都是假值,就返回最后一个)。由于非空字符串被认为是非假值,所以第一个字符串被返回。

41

使用 not in 和一个序列:

if fields[9] not in ('A', 'D', 'E', 'N', 'R'):

这个方法会检查一个元组,Python会把它方便又高效地存储为一个常量。你也可以使用集合字面量:

if fields[9] not in {'A', 'D', 'E', 'N', 'R'}:

不过只有更新版本的Python(Python 3.2 及之后的版本)才会把这个识别为不可变常量。这是新代码中最快的选择。

因为这个只需要一个字符,你甚至可以使用一个字符串:

if fields[9] not in 'ADENR':

撰写回答