我确信有一个非常简单的答案,但在搜索了一段时间后我找不到它。
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.
是否有任何速记方式让代码工作,或者我必须使用对我有用的冗长方式?
答案 0 :(得分:8)
使用以下解决方案之一来实现该条件:
if letter in ['Q', 'O']
if letter in ('Q', 'O')
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”。
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