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
相关产品推荐
相关产品推荐

