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



我正在寻找一种比较两个字符串列表的方法。一个列表中有类似["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")

我也很难理解为什么我可以在比较中更改一些字符串,但仍然可以匹配。以下返回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")

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

首先,您的";逻辑运算符列表";外表和行为与你所期望的完全不同。此:

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

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

["abc"]

表达式"abc" or "def" and "ghi"将向下计算为单个对象,在本例中为"abc"。非空字符串被认为是"空字符串";truthy";,并且二进制CCD_ 8运算符只需要其操作数中的一个为true/truthy。

第二,这个:

if "abd" and "def" in a:

必须解析为:

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

同样,当被计算为一个不同的布尔表达式时,字符串"abd"是非空的,因此是truthy。这类似于说:

if True and "def" in a:

或者简单地说:

if "def" in a:

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

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

仅仅因为你写的代码读起来像一个英语句子,并不意味着Python会这样解释它

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

其他解决方案:

只有当每个列表中没有重复时:您可以将列表转换为一个集合,这是一个只有唯一值的特殊数组,可用于执行特殊操作,例如set(list1(-set(list2(=在list1中但不在list2中的所有元素。如果您想要仅在list1的元素的唯一列表+仅在list2的元素,则需要使用sets的.symmetric_difference方法。set1.symmetric_difference(set2(或set1^set2

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

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

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

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

第二个代码返回true,因为两个字符串值都存在于列表a中,第三个代码返回false,因为字符串"abc";在列表a中;dea";不在列表中。我认为你不能在比较的列表中使用逻辑运算符作为值

相关内容

  • 没有找到相关文章

最新更新