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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:23:02