元组,检查字符串中是否有一个字母

4

我有这段代码:

prefixes = "JKLMNOPQ" 
suffix = "ack" 

for letter in prefixes: 
    if letter in ("O", "Q"):
        print letter + "u" + suffix
    else:
        print letter + suffix

它正常工作,但我不理解一件事。我假设:

if letter in ("O", "Q"):

创建包含两个字母 O 和 Q 的新元组,并检查值字母是否存在。

我不确定的是为什么这样做无法正常工作:

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

这段代码将在所有前缀中添加“u”,而不仅仅是那些带有“O”和“Q”的前缀。
5个回答

6
所有这些都是做同样的事情:
if letter == "O" or letter == "Q":
if letter in ("O", "Q"):
if letter in "OQ":

您的代码行 if letter == "O" or "Q": 实际上被解释为 if (letter == "O") or "Q":,而且 "Q" 会被解释为 True,因此这个表达式总是返回 True


你在第一个例子中漏掉了一个"="。谢谢你的回答。 - damian

2

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

这可以被重写为:

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

最后一个部分是一个非空字符串,总是会被评估为True,因此你的整个表达式都是True
所以你应该像这样写:
if letter == "O" or letter == "Q":

或者使用你的元组代码(更好)。


我觉得这样做更易读、更简洁,没有其他的意思。 - Jacob

1

问题出在这里:

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

应该是:

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

你之前所有的前缀都被添加了“u”的原因是因为“Q”始终为真。

1
值得注意的是,即使优先级不同,它也不起作用:
if letter == ("O" or "Q"):

这样不好,因为"O"是真值,所以"O"或"Q"是"O",所以我们只需将letter"O"进行比较,完全忽略"Q"

在英语中,我们认为"O"或"Q"是一个抽象的概念,根据逻辑要求,它可以是非确定性的"O""Q"。然而,计算机处理的是确定性的量。我们能够接近英语措辞字母是"O"还是"Q"?(并且更加精确)的方式是字母是否为以下之一:"O","Q"?,我们可以稍微形式化一下,如下:字母是否在以下集合中:{"O","Q"}?

Python 允许我们使用 "set" 关键字轻松构建集合,但我们仍然必须明确地指出我们正在检查是否在这个集合中(即,我们测试 "set membership" 而不是相等性)。幸运的是,我们并不严格要求一个集合来检查成员资格。如果我们有大量元素需要测试,并且我们只需要构建一次集合,但需要测试许多字母,则通过正式创建一个 "set" 可能会节省总时间,因为它们针对成员资格测试进行了优化;而对于像 ("O", "Q") 这样的 "tuple",Python 需要逐个检查每个元素。但在这里,"tuple" 也可以很好地工作。
简而言之:你可以按照其他人说的方法解决问题,但他们对问题的解释可能会让你有更多的问题(我希望我在这里回答了这些问题)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接