按键名合并字典列表值:问题与最优实现方法咨询
嘿,这个问题我熟!其实核心就是先把相似的键归好类,再把对应的值合并到一块儿,最后生成新字典就行。下面分几种常见场景给你讲最优实现方式:
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
相关产品推荐
相关产品推荐

