和/或在Python中?

JNa*_*Nat 38 python logic

我知道andor表达式存在于python中,但有任何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("â")
Run Code Online (Sandbox Code Playgroud)

有了这个,我的意思是如果用户输入"a"并且先前定义的列表中包含任何类型的"a",我可以从给定列表中删除所有类型的"a"吗?

python告诉我有一个问题:

someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")
Run Code Online (Sandbox Code Playgroud)

他告诉我: ValueError: list.remove(x): x not in list

sen*_*rle 38

正如Matt Ball的回答所解释的那样,or "和/或".但or不适用于in您在上面使用它的方式.你不得不说if "a" in someList or "á" in someList or....或者更好,

if any(c in someList for c in ("a", "á", "à", "ã", "â")):
    ...
Run Code Online (Sandbox Code Playgroud)

这就是你提出的问题的答案.

其他说明

但是,对于您发布的示例代码,还有一些事情要说.首先,someList.remove... or someList remove...此处的语句链是不必要的,并且可能导致意外行为.它也很难读!最好将其划分为单独的行:

someList.remove("a")
someList.remove("á")
...
Run Code Online (Sandbox Code Playgroud)

然而,即使这还不够.如您所见,如果项目不在列表中,则会引发错误.最重要的是,使用remove非常慢,因为每次调用它时,Python都必须查看列表中的每个项目.因此,如果要删除10个不同的字符,并且列表中包含100个字符,则必须执行1000次测试.

相反,我建议采用一种截然不同的方法.使用a过滤列表set,如下所示:

chars_to_remove = set(("a", "á", "à", "ã", "â"))
someList = [c for c in someList if c not in chars_to_remove]
Run Code Online (Sandbox Code Playgroud)

或者,在不创建副本的情况下就地更改列表:

someList[:] = (c for c in someList if c not in chars_to_remove)
Run Code Online (Sandbox Code Playgroud)

这些都使用列表理解语法来创建新列表.他们查看每个角色someList,查看角色是否在chars_to_remove,如果不是,则在新列表中包含角色.

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

  1. 它只通过someList一次.在上面的场景中,它不执行1000次测试,而是仅执行100次.
  2. 它可以通过一次操作测试所有字符,因为它chars_to_remove是一个set.如果它chars_to_remove是一个listtuple,然后每个测试真的会在上述情况下10次试验-因为在列表中的每个字符将需要单独检查.

  • @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]`,它会覆盖所有值. (3认同)

Mat*_*all 15

or不是排他性的(例如xor)所以or是一样的and/or.


小智 14

x and y如果两者都是x,y则返回true true.
x or y如果任何一个都返回true.

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


Amb*_*ber 5

你在找......

a if b else c
Run Code Online (Sandbox Code Playgroud)

或许你误解了Python的orTrue or TrueTrue.