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

按键名合并字典列表值:问题与最优实现方法咨询

嘿,这个问题我熟!其实核心就是先把相似的键归好类,再把对应的值合并到一块儿,最后生成新字典就行。下面分几种常见场景给你讲最优实现方式:

1. 键有统一前缀/后缀(比如user_alice、user_bob这种)

这种情况最简单,直接提取键的共同部分当新键,遍历原字典把值合并进去就行。如果用collections.defaultdict会更简洁,不用手动判断新键是否存在。

举个实际例子:

from collections import defaultdict

# 假设你的原字典长这样
original_dict = {
    "user_alice": [1, 2],
    "user_bob": [3, 4],
    "user_charlie": [5],
    "admin_dave": [6]
}

merged_dict = defaultdict(list)
for key, value in original_dict.items():
    # 按下划线分割,取前缀当新键
    prefix = key.split("_")[0]
    merged_dict[prefix].extend(value)

# 要是需要转成普通字典就用dict(merged_dict)
print(dict(merged_dict))
# 输出: {'user': [1, 2, 3, 4, 5], 'admin': [6]}

2. 键是近似相似的字符串(比如apple_123、appl_789这种)

这种得靠字符串相似度判断,Python自带的difflib.SequenceMatcher就能搞定,设定一个相似度阈值(比如0.8),把达标的键归为一类。

示例代码:

from difflib import SequenceMatcher
from collections import defaultdict

original_dict = {
    "apple_123": [1],
    "apple_456": [2],
    "appl_789": [3],
    "banana_001": [4]
}

# 自定义相似判断函数,阈值可以调
def is_similar(a, b, threshold=0.8):
    return SequenceMatcher(None, a, b).ratio() >= threshold

merged_dict = defaultdict(list)
processed_keys = set()

for key1, value1 in original_dict.items():
    if key1 in processed_keys:
        continue
    # 找出所有和当前键相似的键
    similar_keys = [key for key in original_dict if is_similar(key1, key)]
    # 合并这些键对应的值
    for key in similar_keys:
        merged_dict[key1].extend(original_dict[key])
        processed_keys.add(key)

print(dict(merged_dict))
# 输出: {'apple_123': [1, 2, 3], 'banana_001': [4]}

3. 键有明确的模式(比如带数字后缀的item_1、item_2)

这种用正则表达式提取核心键名最靠谱,比如把数字后缀去掉,统一归到item这个键下。

示例代码:

import re
from collections import defaultdict

original_dict = {
    "item_1": [10],
    "item_2": [20],
    "item_3": [30],
    "product_a": [40],
    "product_b": [50]
}

merged_dict = defaultdict(list)
# 正则匹配"_数字结尾"的部分,替换为空
pattern = re.compile(r"_\d+$")
for key, value in original_dict.items():
    core_key = pattern.sub("", key)
    merged_dict[core_key].extend(value)

print(dict(merged_dict))
# 输出: {'item': [10, 20, 30], 'product_a': [40], 'product_b': [50]}

为啥直接修改原字典键没用?

因为字典的键是不可变类型(比如字符串),而且字典是哈希表结构,你没法像修改列表元素那样直接改键的“名称”——所谓的修改键,本质是先删旧键再加新键,但这种操作没法自动帮你合并相似键的值,所以直接遍历归类生成新字典才是最高效的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:21:20