python-3.x 使用“in”操作数检查string是否包含带空格和不带空格的关键字

ffscu2ro  于 2023-02-06  发布在  Python
关注(0)|答案(1)|浏览(113)

我编写这段代码是为了通过检查描述(字符串)是否包含特定的关键字来整理一个新的标记列表。
例如

tagslist=['LED_AuraSync', 'LED_ARGB', 'LED_RGB', 'LED_Blue...',]
description=('Arctic Freezer 50 Dual Tower ARGB Heatsink ...')

tagged=[]
for tags in tagslist:
    splitted=tags.split('_')[1]
    if (splitted) in description:
        tagged.append(splitted)

print(tagged)

这也会将ARGB和RGB添加到'tagged'列表中,这是错误的,因为描述实际上只包含ARGB,但是如果我用'in'操作数在'splitted'变量前后添加空格,它会正常工作

if (' '+splitted+' ') in description:

但我不明白它为什么会起作用,有人能解释一下吗?

ux6nzvsh

ux6nzvsh1#

靶区; DR

tagslist = [
    "LED_AuraSync",
    "LED_ARGB",
    "LED_RGB",
    "LED_Blue...",
]
description = "Arctic Freezer 50 Dual Tower ARGB Heatsink ...".split()

tagged = [
    splitted for tag in tagslist if (splitted := tag.split("_")[1]) in description
]

print(tagged)

作为列表综合

为什么它一开始不起作用?(为什么后来起作用)

这个答案的关键部分是in运算符匹配字符串中的任何部分,不管你是否想一个字一个字地匹配**,所以"RGB" in "ARGB"应该被计算为True
但是如果你用空格分隔描述(将其转换为一个字符串列表),并使用in操作符,它会工作,因为它比较列表中的每个字符串,看看它们是否与给定的字符串相同,而不是匹配它的子字符串。
通过使用" " + splitted + " " in description,您实际上匹配了splitted及其周围的空白,因此当它是"RGB"的迭代时,如果" RGB "在描述中,则实际上是在进行投资,而它不在描述中,因此不将其追加到列表中。
∮ ∮ ∮ ∮更深入的理解∮
我猜op对python没有太多的经验,所以我会在这里做一点解释:)
对名单的理解,

tagged = [
    splitted for tag in tagslist if (splitted := tag.split("_")[1]) in description
]

基本(不完全)等同于以下内容:

tagged = []
for tag in tagslist:
  splitted = tag.split("_")
  if splitted in description:
    tagged.append(splitted)

其中Warlus运算符:=tag.split("_")[1]分配给解析中的splitted以使其仅计算一次。
另一种写法是

tagged = [
   tag.split("_")[1]
   for tag in tagslist 
   if tag.split("_")[1] in description
]

但是它将计算tag.split("_")[1]两次。

相关问题