在if语句条件中使用“或”

时间:2012-01-07 07:56:14

标签: python

我确信有一个非常简单的答案,但在搜索了一段时间后我找不到它。

prefixes = "JKLMNOPQ"
suffix = "ack"

for letter in prefixes:
    if letter == "Q" or letter == "O":
        print letter + "u" + suffix
    else:
        print letter + suffix

上面的代码完美无缺,if语句的条件似乎有点啰嗦,所以我试过了:

if letter == "Q" or "O":

更短但不起作用。我发现它不起作用,因为“O”是一个布尔表达式,它总是为True,并且它不考虑“或”左侧的任何内容。

我试着在它周围加上括号:

if letter == ("Q" or "O"):

但只匹配Q而不是O.

是否有任何速记方式让代码工作,或者我必须使用对我有用的冗长方式?

5 个答案:

答案 0 :(得分:8)

使用以下解决方案之一来实现该条件:

  • list:if letter in ['Q', 'O']
  • 元组:if letter in ('Q', 'O')
  • string:if letter in 'QO'

更新:为了完整性:正则表达式:re.match('[OQ]', letter)(从Paul Hankings answer 复制(如果您认为正则表达式是解决方案,则应该投票给他的答案)

答案 1 :(得分:4)

您可以使用letter in 'OQ're.match('[OQ]', letter)

更彻底的是,我可能会定义一串前缀来获取'u'。

prefixes = 'JKLMNOPQ'
prefixes_taking_u = 'OQ'
suffix = 'ack'
for p in prefixes:
    u_part = 'u' if p in prefixes_taking_u else ''
    print p + u_part + suffix

在您的代码中,letter == ("O" or "Q")首先评估("O" or "Q")(“O”不为false,因此结果为“O”),因此这与letter == "O"相同。< / p>

你的另一次尝试,letter == "O" or "Q"首先评估letter == "O",如果是真,则给出答案为真,否则它会给出答案“Q”。

您可以在language reference.

中找到有关or工作原理的文档

答案 2 :(得分:1)

if letter in ['Q', 'O']
不过,最好不要专注于编写代码的方式。

答案 3 :(得分:0)

另外还有一个变体(如果有很多前缀,则更快,而不仅仅是两个):

prefixes = frozenset('QO')
if letter in prefixes:
    #...

答案 4 :(得分:0)

“in string”选项最好,在这种特殊情况下,输入是单个字符。更一般地说,对于少量可能的值,“in tuple”优先于“in list”,因为最近的Pythons将在编译时构建元组,而列表是在运行时构建的。

当有很多选项时,可以构建一次set或freezeset,并快速查询多次。

正则表达式方法比上面讨论的选项更复杂和/或更慢。

(1)re.match('[QO]', letter)无法与letter in 'QO'

竞争

(2)最初needs_u = re.compile('[QO]').match后跟needs_u(letter)与初始needs_u = set('QO')后跟letter in needs_u

相比是可怕的