【问题标题】:How to compare strings with logical operators to a list of strings?如何将带有逻辑运算符的字符串与字符串列表进行比较?
【发布时间】:2021-09-09 00:56:11
【问题描述】:

我正在寻找一种方法来比较 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")

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

【问题讨论】:

  • 这里有一些语法混乱。如果您有b = ["abc" or "def" and "ghi"],则计算结果为b = ['abc'],因为表达式"abc" or "def" and "ghi""abc" 计算为真值,并且因为它为真,所以它成为表达式的值。 orand 条件是预先评估的,不是列表的一部分。
  • 看起来你想使用设置交集并检查它是否非零?
  • 其次,如果你评估if "abd" and "def" in a:,这相当于if "abd" and ("def" in a):,它相当于if "def" in a:,因为"abc"是真的。你可能想要if "abc" in a and "def" in a:

标签: python logical-operators string-comparison


【解决方案1】:

尽管是有效的 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 会这样解释它。

【讨论】:

    【解决方案2】:

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

    其他解决方案:

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

    【讨论】:

      【解决方案3】:

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

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

      如果"abc" 是集合的一部分,或者"def""ghi"(这里&lt;= 表示子集),则上述情况为真。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-07
          • 2018-05-18
          • 2020-12-18
          • 1970-01-01
          • 2014-07-15
          • 1970-01-01
          • 2010-12-24
          相关资源
          最近更新 更多