我知道python中存在 and
和 or
表达式,但是有没有 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 许可协议
正如 Matt Ball 的回答所解释的,
or
_是_“和/或”。但是or
不适用于in
你上面使用它的方式。你不得不说if "a" in someList or "á" in someList or...
。或者更好的是,这就是您所问问题的答案。
其他注意事项
但是,对于您发布的示例代码,还有一些话要说。首先,这里的
someList.remove... or someList remove...
语句链是不必要的,可能会导致意外行为。也很难读!最好把它分成几行:然而,即使这样还不够。正如您所观察到的,如果该项目不在列表中,则会引发错误。最重要的是,使用
remove
非常慢,因为每次调用它时,Python 都必须查看列表中的每个项目。因此,如果您要删除 10 个不同的字符,并且您有一个包含 100 个字符的列表,则必须执行 1000 次测试。相反,我会建议一种非常不同的方法。使用
set
过滤列表,如下所示:或者,在不创建副本的情况下就地更改列表:
它们都使用列表理解语法来创建一个新列表。他们查看
someList
中的每个字符,检查该字符是否在chars_to_remove
中,如果不是,则将该字符包含在新列表中。这是此代码最有效的版本。它有两个速度优势:
someList
一次。在上述场景中,它只执行 100 次,而不是执行 1000 次测试。chars_to_remove
是set
。如果它chars_to_remove
是list
或tuple
,那么每个测试实际上将是 10 个测试在上述场景中 - 因为每个字符都需要逐个检查。