python - 如何将带有逻辑运算符的字符串与字符串列表进行比较?
问题描述
我正在寻找一种方法来比较 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")
解决方案
尽管是有效的 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 会这样解释它。
推荐阅读
- javascript - 在反应组件中使用异步等待
- mongodb - 使用聚合查询从嵌套数组 mongo 中的每个元素返回展平数组
- laravel - Laravel:将输入查询的结果更改为友好的 url
- xaml - 如何将运行时类中的数组绑定到 ListView?
- java - 如何比较对象列表及其属性,然后在 Java 中更新原始列表
- compilation - 如何创建、编译和链接引导加载程序?
- version-control - 是否需要将 .ballerina 提交到版本控制
- javascript - 从 php 文件中执行 javascript
- date - 过滤当前月份的 Google 表格数据透视表
- java - 为什么 InputStream 读取方法会阻塞资源?