As 马特·鲍尔 https://stackoverflow.com/a/10149756/577088的回答解释说,or
is“和/或”。但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
,如果不是,则将该字符包含在新列表中。
这是该代码最有效的版本。它有两个速度优势:
- 它只经过
someList
一次。在上述场景中,它只执行 100 次,而不是执行 1000 次测试。
- 它可以通过一次操作测试所有字符,因为
chars_to_remove
is a set
. If it chars_to_remove
were a list
or tuple
,那么在上述场景中,每个测试实际上是 10 个测试 - 因为列表中的每个字符都需要单独检查。