40

我知道python中存在andandor表达式,但是有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

4

7 回答 7

40

正如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_removelistor tuple,那么在上述场景中,每个测试实际上是 10 个测试——因为列表中的每个字符都需要单独检查。
于 2012-04-14T00:13:16.037 回答
15

or不是排他性的(例如xor),所以orand/or.

于 2012-04-13T23:53:31.087 回答
15

x and y如果两者xy都是则返回真true
x or y如果其中一个是 则返回true

由此我们可以得出结论,它or包含and在自身之中,除非你的意思是xOR(或者除非and是真的)

于 2012-04-13T23:53:32.417 回答
5

你在寻找...

a if b else c

或者你可能误解了 Python 的orTrue or TrueTrue

于 2012-04-13T23:53:31.853 回答
4

对于更新后的问题,您可以使用以下内容替换您想要的内容:

someList = filter(lambda x: x not in ("a", "á", "à", "ã", "â"), someList)

filter通过将列表中的每个元素传递给提供的 lambda 来评估它。在这个 lambda 中,我们检查元素是否不是提供的字符之一,因为这些字符应该保留在列表中。

或者,如果其中的项目someList应该是唯一的,您可以制作someList一个集合并执行以下操作:

someList = list(set(someList)-set(("a", "á", "à", "ã", "â")))

这本质上是集合之间的差异,它可以满足您的需求,但也确保每个元素只出现一次,这与列表不同。请注意,在这种情况下,您可以从一开始就将其存储someList为一组,它会稍微优化一下。

于 2012-04-14T00:23:36.733 回答
0

试试这个解决方案:

for m in ["a", "á", "à", "ã", "â"]:
    try:
        somelist.remove(m)
    except:
        pass

仅供您参考。andor运算符也用于返回值。当您需要为变量赋值但您有一些先决条件时,它很有用

运算符or首先返回非空值

#init values
a,b,c,d = (1,2,3,None)

print(d or a or b or c)
#output value of a - 1

print(b or a or c or d)
#output value of b - 2

and如果任何成员没有None值或者如果它们至少有一个我们得到的 None 值,则运算符返回序列中的最后一个值None

print(a and d and b and c)
#output: None

print(a or b or c)
#output value of c - 3
于 2018-03-21T08:24:57.137 回答
-3
if input == 'a':
    for char in 'abc':
        if char in some_list:
            some_list.remove(char)
于 2012-04-14T13:11:34.833 回答