和/或在Python中?
我知道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
和和或表达式,但是有和/或表达式吗?或者以某种方式将它们组合起来,以产生与和/或表达式相同的效果
我的代码如下所示:
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
为Truex和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:的确,它就是这样做的。这个不起作用。。。我认为它把列表变成了一个过滤器,而不是过滤它。。。这可能吗?我认为最初的问题更多地涉及如何表达“和/或”语句,而不是从列表中删除一些元素。