Python:根据子串匹配为字典列表添加对应源字典键名
解决字典列表匹配子串并添加对应键的问题
你的问题出在匹配逻辑完全搞反了,而且循环的目标也不对——咱们一步步来修正:
先看你原有代码的问题
你写的判断条件是 if m['thing'] in k:,这里有两个明显错误:
k是字典d的键(比如'a'、'b'),不是你要匹配的列表元素(比如'apple'、'dog')- 你搞反了匹配方向:应该是检查d里的列表元素是否是
m['thing']的子串,而不是反过来把长文本往短键里塞
基础实现方案(直观易懂)
先遍历x里的每个条目,再逐个检查d中哪个列表包含的元素是当前条目的thing字段的子串,找到后就给条目添加list键:
# 遍历x中的每个字典条目 for item in x: thing_content = item['thing'] # 遍历d的键和对应的列表 for list_key, elements in d.items(): # 检查当前列表里有没有元素是thing_content的子串 for elem in elements: if elem in thing_content: item['list'] = list_key # 找到匹配就跳出所有内层循环,避免重复匹配 break else: # 当前列表没找到匹配,继续下一个列表 continue # 找到对应key后,跳出外层循环 break
运行这段代码后,你的x就会变成你想要的结果:
[{'thing': 'apple | fruit', 'list': 'a'}, {'thing': 'dog | animal', 'list': 'c'}, {'thing': 'boat | vehicle', 'list': 'b'}]
优化方案(大数据量更高效)
如果d里的列表元素很多,重复遍历会浪费性能。可以先提前构建一个元素到对应键的反向映射字典,之后直接查找即可:
# 先构建反向映射:元素 -> 所属列表的键 element_map = {} for key, elements in d.items(): for elem in elements: element_map[elem] = key # 遍历x处理每个条目 for item in x: thing_content = item['thing'] # 遍历反向映射,找到匹配的元素 for elem, list_key in element_map.items(): if elem in thing_content: item['list'] = list_key break
这个方法把匹配的时间复杂度从O(n*m)降到了O(n)(n是x的长度,m是d的总元素数),数据量大的时候优势很明显。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

