和/或用Python?

2024-04-25 13:54:57 发布

您现在位置: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


Tags: orand代码用户in类型列表input
3条回答

如果xy都是true,则x and y返回true。
x or y如果其中一个是true,则返回。

由此我们可以得出结论,or在其内部包含and,除非您是指xOR(或者and是真的)

正如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_remove是一个set。如果chars_to_removelisttuple,那么在上述场景中,每个测试实际上是10个测试——因为列表中的每个字符都需要单独检查。

or不是独占的(例如^{}),因此orand/or是同一回事。

相关问题 更多 >