Python中的和/或?

新手上路,请多包涵

我知道python中存在 andor 表达式,但是有没有 and/or 表达式?或者以某种方式组合它们以产生与 and/or 表达式相同的效果?

我的代码看起来像这样:

 if input=="a":
    if "a" or "á" or "à" or "ã" or "â" in someList:
        someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")

有了这个,我的意思是如果用户输入“a”并且任何类型的“a”包含在先前定义的列表中,我可以从给定列表中删除所有类型的“a”吗?

python告诉我有一个问题:

 someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")

他告诉我: ValueError: list.remove(x): x not in list

原文由 JNat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
2 个回答

正如 Matt Ball 的回答所解释的, or _是_“和/或”。但是 or 不适用于 in 你上面使用它的方式。你不得不说 if "a" in someList or "á" in someList or... 。或者更好的是,

 if any(c in someList for c in ("a", "á", "à", "ã", "â")):
    ...

这就是您所问问题的答案。

其他注意事项

但是,对于您发布的示例代码,还有一些话要说。首先,这里的 someList.remove... or someList remove... 语句链是不必要的,可能会导致意外行为。也很难读!最好把它分成几行:

 someList.remove("a")
someList.remove("á")
...

然而,即使这样还不够。正如您所观察到的,如果该项目不在列表中,则会引发错误。最重要的是,使用 remove 非常慢,因为每次调用它时,Python 都必须查看列表中的每个项目。因此,如果您要删除 10 个不同的字符,并且您有一个包含 100 个字符的列表,则必须执行 1000 次测试。

相反,我会建议一种非常不同的方法。使用 set 过滤列表,如下所示:

 chars_to_remove = set(("a", "á", "à", "ã", "â"))
someList = [c for c in someList if c not in chars_to_remove]

或者,在不创建副本的情况下就地更改列表:

 someList[:] = (c for c in someList if c not in chars_to_remove)

它们都使用列表理解语法来创建一个新列表。他们查看 someList 中的每个字符,检查该字符是否在 chars_to_remove 中,如果不是,则将该字符包含在新列表中。

这是此代码最有效的版本。它有两个速度优势:

  1. 它只通过 someList 一次。在上述场景中,它只执行 100 次,而不是执行 1000 次测试。
  2. 它可以通过一次操作测试所有字符,因为 chars_to_removeset 。如果它 chars_to_removelisttuple ,那么每个测试实际上将是 10 个测试在上述场景中 - 因为每个字符都需要逐个检查。

原文由 senderle 发布,翻译遵循 CC BY-SA 3.0 许可协议

x and y 如果 xy 都是 true ,则返回真

x or y 如果其中一个是 true 则返回。

From this we can conclude that or contains and within itself unless you mean xOR (or except if and is true)

原文由 user1241335 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏