如何将带有逻辑运算符的字符串与字符串列表进行比较?

How to compare strings with logical operators to a list of strings?

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

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

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

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

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

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

这个returnsFalse.

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

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

第二个代码 returns true 因为字符串值都出现在列表 a 中,第三个代码 returns false 因为字符串“abc”在列表 a 和“dea”中不在列表中。而且我认为您不能将逻辑运算符用作列表中的值进行比较

为了检查列表 1 中是否包含列表 2 的所有元素,您需要使用循环遍历列表 2 来检查每个元素。根据您想要的结果,这可以是不在列表 1 中的 list2 元素的列表、它们的计数,或者每个 list2 元素具有 True 或 False 的真值数组

其他解决方案:

ONLY IF YOU DONT HOVE DUPPLICATES IN EACH OF THE LISTs: 你可以把列表变成一个集合,这是一个特殊的数组,只有唯一的值,可以用来执行特殊的操作,比如 set(list1) - set(list2) = list1 中但不在 list2.If 中的所有元素您想要仅在 list1 中的唯一元素列表 + 仅在 list2 中的元素您需要使用 .symmetric_difference 集的方法。 set1.symmetric_difference(set2) 要么 集合 1 ^ 集合 2

我建议使用 sets 而不是列表(只需通过 set(a) 转换),然后通过集合操作执行检查:

s = set(a)
if "abc" in s or {"def", "ghi"} <= s:
    ...

如果 "abc" 是集合的一部分,或者 "def""ghi" 都是集合的一部分(这里 <= 表示子集),则上述内容成立。

因此,为了检查 所有 个集合 b 中的元素是否包含在 a(或相应的 s = set(a))中,您可以使用 s.issuperset(b).

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

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

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

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

["abc"]

表达式 "abc" or "def" and "ghi" 将计算为单个对象,在本例中为 "abc"。非空字符串被认为是“真实的”,二元 or 运算符只需要其操作数之一为 true/truthy 即可使整个表达式计算为 true/truthy.

二、这个:

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 会这样解释它。