和/或在Python中?

和/或在Python中?,python,logic,Python,Logic,我知道python中存在和和或表达式,但是有和/或表达式吗?或者以某种方式将它们组合起来,以产生与和/或表达式相同的效果 我的代码如下所示: if input=="a": if "a" or "á" or "à" or "ã" or "â" in someList: someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.rem

我知道python中存在
表达式,但是有
和/或
表达式吗?或者以某种方式将它们组合起来,以产生与
和/或
表达式相同的效果

我的代码如下所示:

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("â")
someList = list(set(someList)-set(("a", "á", "à", "ã", "â")))
这样,我的意思是,如果用户输入“a”,并且任何类型的“a”都包含在先前定义的列表中,那么我可以从给定列表中删除所有类型的“a”吗

python告诉我在以下方面存在问题:

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

他告诉我:
ValueError:list.remove(x):x不在列表中
不是排他性的(例如),因此
和/或
是同一件事,你在寻找

a if b else c

或者您可能误解了Python的
<如果
x
y
均为
True
,则code>True或True
True

x和y
返回True
x或y
如果其中一个为
true
则返回

由此我们可以得出结论,
本身包含
,除非你的意思是
xOR
(或者除非
是真的)

正如答案所解释的,
是“和/或”。但是,
与上述使用方式中的
不起作用。如果someList中的“a”或someList中的“á”或…,则必须说
。或者更好

if any(c in someList for c in ("a", "á", "à", "ã", "â")):
    ...
这就是你所问问题的答案

其他注释 然而,关于您发布的示例代码,还有一些事情要说。首先是
someList.remove的链。。。或someList remove…
此处的语句是不必要的,可能会导致意外行为。它也很难阅读!最好将其分为几行:

someList.remove("a")
someList.remove("á")
...
然而,这还不够。正如您所观察到的,如果该项不在列表中,则会抛出一个错误。除此之外,使用
remove
速度非常慢,因为每次调用它时,Python都必须查看列表中的每一项。因此,如果要删除10个不同的字符,并且列表中有100个字符,则必须执行1000个测试

相反,我会建议一种非常不同的方法。使用
集合
筛选列表,如下所示:

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\u to\u remove
中,如果不是,则将该字符包括在新列表中

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

  • 它只通过
    someList
    一次。在上述场景中,它只执行100个测试,而不是执行1000个测试
  • 它可以通过一次操作测试所有字符,因为
    chars\u to\u remove
    是一个
    集合
    。如果要删除的字符是一个
    列表
    元组
    ,那么在上述场景中,每个测试实际上是10个测试——因为列表中的每个字符都需要单独检查

  • 对于更新后的问题,您可以将所需内容替换为以下内容:

    someList = filter(lambda x: x not in ("a", "á", "à", "ã", "â"), someList)
    
    filter
    通过将列表中的每个元素传递给提供的lambda来计算它。在这个lambda中,我们检查元素是否不是提供的字符之一,因为这些字符应该保留在列表中

    或者,如果
    someList
    中的项目应该是唯一的,则可以将
    someList
    设置为一组,并执行以下操作:

    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("â")
    
    someList = list(set(someList)-set(("a", "á", "à", "ã", "â")))
    
    这本质上是利用集合之间的差异,这是您想要的,但也确保每个元素只出现一次,这与列表不同。注意:您可以从一开始就将
    someList
    存储为一个集合。在这种情况下,它将稍微优化一些内容。

    尝试以下解决方案:

    if input == 'a':
        for char in 'abc':
            if char in some_list:
                some_list.remove(char)
    
    for m in ["a", "á", "à", "ã", "â"]:
        try:
            somelist.remove(m)
        except:
            pass
    
    仅供参考
    运算符也用于返回值。当您需要为变量赋值,但有一些先决条件时,它非常有用

    运算符
    返回第一个非空值

    #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
    
    如果任何成员没有
    None
    值,或者如果他们至少有一个None值,则运算符
    返回序列中的最后一个值,我们得到
    None

    print(a and d and b and c)
    #output: None
    
    print(a or b or c)
    #output value of c - 3
    

    给我们一个描述可能输入的真值表,以及您期望的结果。
    someList[:]
    实际上是什么意思?@JNat,它被称为“切片赋值”,它将给定序列中的值赋值给列表的“切片”。例如,假设我们有
    a=[1,2,3,4]
    。然后我们做
    a[0:2]=[3,4]
    。现在
    a
    的值是
    [3,4,3,4]
    。与其他类型的切片一样,省略索引意味着“从开始”或“到结束”。要分配的序列可以与切片具有不同的长度。我们可以这样做,
    a[:2]=[2]
    ,然后
    a
    的值是
    [2,3,4]
    。最后,我们可以关闭这两个选项,并执行如下操作:
    a[:]=[11,12,13]
    ,它将覆盖所有值。使用
    filter
    选项,它将计算列表中的每个
    x
    ,如果未包含在提供的字符中,则保留它们。是这样吗?@JNat:的确,它就是这样做的。这个不起作用。。。我认为它把列表变成了一个过滤器,而不是过滤它。。。这可能吗?我认为最初的问题更多地涉及如何表达“和/或”语句,而不是从列表中删除一些元素。