如果在Python中使用命令

3
if "aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]:
    self.xx = xxxx

我有这样一段代码,用于检查attrs["show"]是否包含以下任意一个字符串,如果是,则给self.xx赋值。

但是这个“IF”命令正确吗?因为从我的结果来看,似乎这个if命令总是为真(这是不可能的)。

3个回答

15

请尝试以下操作:

if any(s in attrs["show"] for s in ("aa", "bb", "cc", "dd", "ee", "ff")):
    self.xx = xxxx

您当前的 if 语句将始终评估为 True,因为您检查的不是每个字符串是否在 attrs["show"] 中,而是检查"aa" 是否为 True,或者"bb" 是否为 True等等。由于在布尔上下文中"aa"将始终计算为 True,因此您将始终进入if子句。

相反,像我的示例一样使用any()函数,它接受可迭代对象并在其任何元素为True时返回True。类似于代码中的一堆or,该方法在找到首个为 True 的元素后立即停止运行。在此示例中,上述代码等效于以下内容(但更加简洁!):

if ("aa" in attrs["show"] or "bb" in attrs["show"] or "cc" in attrs["show"] or
    "dd" in attrs["show"] or "ee" in attrs["show"] or "ff" in attrs["show"]):
    self.xx = xxxx

在这里,使用集合比元组更适合,因为在集合上,成员资格是O(1),而不是O(n)。 - Gareth Latty
@Lattyware - 不,实际上将其更改为集合不会有任何区别,因为我们正在测试attrs["show"]中的成员资格(它可能已经是一个集合),而不是在我定义用于循环遍历字符串的元组中。唯一的变化是您可能以不同的顺序检查字符串。 - Andrew Clark

4
在Python中,or会返回第一个为True的操作数(因为True与任何操作数做或运算都为True,所以Python不需要再查找其它操作数)。因此:
"aa" or "bb" or "cc" or "dd" or "ee" or "ff" in attrs["show"]

...的结果是:

"aa"

这是正确的,因为它是一个非空字符串。余下的内容甚至都不需要考虑。

所以你的if语句总是会执行,因为它总是True

你需要的是像这样的:

"aa" in attrs["show"] or "bb" in attrs["show"] or "cc" in attrs["show"] ...

这段文字很啰嗦,所以你可以使用any和生成器表达式来更简洁地编写它。

any(s in attrs["show"] for s in ["aa", "bb", "cc", "dd", "ee", "ff"])

3
您的IF语句没有测试任何内容。由于它的书写方式,它将始终评估为true
您正向python提出以下问题:
Is aa true
Is bb true
...

Python说“是的,'aa'是真的,因为它在那里!”

更正你的if语句或找到更好的方法来查找列表中的值:

any(x in ['aa','bb','cc','dd','ee','ff'] for x in attrs["show"])

你的第一部分是正确的。但是 if ("aa" or "bb" ...) in attrs["show"] 等同于 if "aa" in attrs["show"],所以不是你想要的。 - Mikel
你“修正”的if语句总是在attrs["show"]中寻找“aa”,而你的第二个例子逻辑上是反向的。 - kindall
@rubik 你介意澄清一下吗?我的回答是基于问题发布者提供的尽可能多的信息而得出的解决方案。我无法创造比所给出的更多的信息。 - PenguinCoder
1
不,它并不相同。("aa" or "bb" or "cc" or "dd" or "ee" or "ff") in attrs["show"]"aa" in attrs["show"]是不同的。 - kindall
第二个例子仍然是错误的。您正在检查字符串attrs[show]的每个字符是否在列表['aa', 'bb', 'cc', 'dd', 'ee', 'ff']中。由于列表项都是两个字符,因此这总是False - kindall
显示剩余6条评论

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