You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何高效比较字符串列表并按指定关键词拆分生成目标列表?

解决代码逻辑问题:正确分类包含/不包含指定字符串的元素

我来帮你搞定这个问题!你的代码逻辑有个小疏漏:你把t_names和t_codes做了嵌套循环,这会导致每个t_codes里的元素被重复检查三次(对应t_names里的三个值),进而重复添加到两个列表中,自然得不到你想要的结果。

问题分析

原代码的核心问题在于:

  • 每个t_codes元素会被遍历三次(每次对应一个t_names中的字符串)
  • 不包含任何目标字符串的元素会被三次添加到doesnt_contain
  • 包含某个目标字符串的元素,会被匹配到的那一次加入does_contain,同时被另外两次加入doesnt_contain
    最终两个列表都会出现重复和错误的元素。

正确的解决方案

我们应该对每个t_codes元素只检查一次,判断它是否包含t_names中的任意一个字符串,再根据结果分到对应的列表中。这里有两种实现方式:

方式1:使用子字符串匹配(更高效,适合当前场景)

因为你的需求是检查是否包含精确的子字符串,不需要正则表达式,直接用in操作符即可:

t_codes = ["11-XXX-Yaas-ZaaS-XXX-ZZZZ-Outsite-VM-ZRA-Operator", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-Outsite-VM-ZRA-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-Outsite-ZRA-User-VM-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-NewFm-VM-ZRA-Operator", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-VM-ZRA-Operator", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-NewFm-VM-ZRA-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-NewFm-ZRA-User-VM-Admin", "22-GLB-IaaS-PaaS-PROD-MSDP-Outsite-VM-ZRA-Operator", "22-GLB-IaaS-PaaS-PROD-MSDP-Outsite-VM-ZRA-Admin", "22-GLB-IaaS-PaaS-PROD-MSDP-Outsite-ZRA-User-VM-Admin", "22-GLB-IaaS-PaaS-PROD-MSDP-CUSTOMER-IN-ZRA-User-VM-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-VM-ZRA-Operator"]
t_names = ["Outsite", "NewFm", "CUSTOMER-IN"]

does_contain = []
doesnt_contain = []

for team in t_codes:
    # 判断当前元素是否包含t_names中的任意一个字符串
    has_target = any(name in team for name in t_names)
    if has_target:
        does_contain.append(team)
    else:
        doesnt_contain.append(team)

print("列表1(不包含t_names任一元素):")
print(doesnt_contain)
print("-------------")
print("列表2(包含t_names任一元素):")
print(does_contain)

方式2:使用正则表达式(适合需要复杂匹配的场景)

如果你后续需要更复杂的正则匹配规则,可以保留re.search,但同样用any()函数统一判断:

import re

t_codes = ["11-XXX-Yaas-ZaaS-XXX-ZZZZ-Outsite-VM-ZRA-Operator", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-Outsite-VM-ZRA-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-Outsite-ZRA-User-VM-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-NewFm-VM-ZRA-Operator", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-VM-ZRA-Operator", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-NewFm-VM-ZRA-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-NewFm-ZRA-User-VM-Admin", "22-GLB-IaaS-PaaS-PROD-MSDP-Outsite-VM-ZRA-Operator", "22-GLB-IaaS-PaaS-PROD-MSDP-Outsite-VM-ZRA-Admin", "22-GLB-IaaS-PaaS-PROD-MSDP-Outsite-ZRA-User-VM-Admin", "22-GLB-IaaS-PaaS-PROD-MSDP-CUSTOMER-IN-ZRA-User-VM-Admin", "11-XXX-Yaas-ZaaS-XXX-ZZZZ-VM-ZRA-Operator"]
t_names = ["Outsite", "NewFm", "CUSTOMER-IN"]

does_contain = []
doesnt_contain = []

for team in t_codes:
    has_target = any(re.search(name, team) for name in t_names)
    if has_target:
        does_contain.append(team)
    else:
        doesnt_contain.append(team)

print("列表1(不包含t_names任一元素):")
print(doesnt_contain)
print("-------------")
print("列表2(包含t_names任一元素):")
print(does_contain)

运行结果

执行上述代码后,你会得到完全符合预期的两个列表:

  • 列表1(不包含目标字符串):["11-XXX-Yaas-ZaaS-XXX-ZZZZ-VM-ZRA-Operator" , "11-XXX-Yaas-ZaaS-XXX-ZZZZ-VM-ZRA-Operator"]
  • 列表2(包含目标字符串):所有包含Outsite/NewFm/CUSTOMER-IN的元素

内容的提问来源于stack exchange,提问作者kishore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:17:50