元组,检查字符串中的字母

时间:2011-08-12 11:49:05

标签: python tuples

我有这段代码:

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"):

创建带有2个字母的新元组:O和Q并检查是否存在值字母。

我不确定的是为什么这不能正常工作:

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

此代码将“u”添加到所有前缀,而不仅仅是“O”和“Q”。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

平等比较优先于“或”运算符:http://docs.python.org/reference/expressions.html#summary

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

如果1)字母是“O”或2)“Q”

,则

成功

由于“Q”的计算结果为True,因此该if语句总是成功。

答案 2 :(得分:1)

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

这可以改写为:

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

最后一部分,一个非空的字符串,总是计算为True,因此整个表达式为True

所以你写得像这样:

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

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

答案 3 :(得分:1)

问题在于:

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

应该是:

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

你将“u”添加到所有前缀的原因是因为“Q”始终为真。

答案 4 :(得分:1)

值得注意的是,即使优先权不同,它也行不通:

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

这不好,因为"O"是真实的*,所以"O" or "Q"是“O”,所以我们只需将letter"O"进行比较并忽略{完全{1}}。

在英语中,我们认为"Q"是一个抽象概念,根据逻辑需要,它是"O" or "Q""O"的非确定性概念。然而,计算机处理确定的数量。我们最接近英语短语"Q"(更确切地说,我们在它的时候):)是Is the letter "O" or "Q"?我们可以将其形式化为Is the letter one of the following: "O", "Q"?

Python允许我们轻松地构建集合(使用Is the letter in the following set: {"O", "Q"}?)关键字,但我们仍然必须明确我们正在检查setletter这个集合的事实(即,我们测试设置成员资格,而不是相等)。幸运的是,我们并不严格要求一套检查会员资格。 (如果我们有大量要测试的元素,并且我们只需要构建一次但有许多字母要测试,那么我们可以通过正式创建in来节省总时间,因为它们已经过优化成员资格测试;使用像set这样的tuple,Python需要一次检查一个元素。但在这里,("O", "Q")工作得很好。)

简而言之:你按照别人说的方式解决问题,但他们对问题的解释应该让你提出更多问题(我希望我在这里回答)。