首页 > 解决方案 > 如何将带有逻辑运算符的字符串与字符串列表进行比较?

问题描述

我正在寻找一种方法来比较 2 个字符串列表。一个列表中包含逻辑运算符,例如["abc" or "def" and "ghi"]. 我正在寻找一些简单的东西来比较 if"abc"("def" and "ghi")are 在字符串列表中,如["def", "ghi", "jlk"]. 两个列表都来自列表或字典,因此它们都需要是变量。我想做类似以下的事情。

a = ["def", "ghi", "jlk"]
b = ["abc" or "def" and "ghi"]    

if b in a:
  print("True")
else:
  print("False")

我也很难理解为什么我可以在比较中更改一些字符串并且仍然得到匹配。以下返回 True

a = ["abc", "def", "ghi", "jkl"]

if "abd" and "def" in a:
    print("True")

这返回False

a = ["abc", "def", "ghi", "jkl"]

if "abc" and "dea" in a:
    print("True")

标签: pythonlogical-operatorsstring-comparison

解决方案


尽管是有效的 Python 代码,但您编写的内容在语义上与您想要实现的内容相去甚远。这是由于对语言行为方式或可以使其行为方式的一些错误假设造成的。

首先,您的“逻辑运算符列表”的外观和行为与您所期望的完全不同。这个:

["abc" or "def" and "ghi"]

是一个列表文字,由于短路评估,它将评估为包含单个字符串项的列表:

["abc"]

在这种情况下,表达式"abc" or "def" and "ghi"将计算为单个对象"abc"。非空字符串被认为是“真”,二元or运算符只需要其操作数之一为真/真,以便整个表达式评估为真/真。

其次,这个:

if "abd" and "def" in a:

必须解析为:

if ("abd") and ("def" in a):

同样,当评估为不同的布尔表达式时,字符串"abd"是非空的,因此是真实的。这类似于说:

if True and "def" in a:

或者简单地说:

if "def" in a:

有不同的方法可以解决这个问题,但也许您正在寻找的最简单的解决方案是:

if ("abc" in a) or ("def" in a and "ghi" in a):

仅仅因为您编写的代码对您来说读起来像一个英文句子,并不意味着 Python 会这样解释它。


推荐阅读