如何用字典列表替换目标字典内列表中的指定元素?
实现需求:合并d1和d2得到目标字典
我明白你的需求了——要把d2里的字符串对应替换到d1列表中匹配的数字位置上。这里提供一个高效清晰的实现方案:
步骤1:先把d2转换成便于查找的映射结构
d2的结构是列表套字典,直接查找效率低,我们先把它转成嵌套字典,用marker作为外层键,数字键作为内层键,对应的值就是要替换的字符串:
d1 = {"00f_5": [1, 2, 3], "00f_6": [1, 2, 3]} d2 = [{"marker": "00f_5", 1: 'AAA'}, {"marker": "00f_6", 1: 'CCC'}, {"marker": "00f_5", 2: "AAC"}] # 构建映射字典 marker_mapping = {} for item in d2: # 取出当前条目里的marker并移除 current_marker = item.pop('marker') # 取出数字键和对应的字符串(每个item只有一个额外键值对) num_key, text_val = next(iter(item.items())) # 初始化当前marker的子字典(如果还不存在) if current_marker not in marker_mapping: marker_mapping[current_marker] = {} # 存入数字键与字符串的对应关系 marker_mapping[current_marker][num_key] = text_val
转换后的marker_mapping结构是:
{"00f_5": {1: "AAA", 2: "AAC"}, "00f_6": {1: "CCC"}}
步骤2:遍历d1完成替换
用列表推导式遍历d1的每个列表元素,根据映射字典做替换——如果元素在映射中有对应字符串就替换,否则保留原数值:
for key in d1: d1[key] = [marker_mapping.get(key, {}).get(num, num) for num in d1[key]]
最终结果
执行完代码后,打印d1就能得到你想要的输出:
print(d1) # 输出:{"00f_5": ["AAA", "AAC", 3], "00f_6": ["CCC", 2, 3]}
补充说明
- 如果d2中存在同一marker下重复的数字键,后出现的条目会覆盖之前的,这符合常规的更新逻辑;
- 整个方案的时间复杂度是O(n+m),n是d2的长度,m是d1所有列表元素的总数,效率很高。
内容的提问来源于stack exchange,提问作者Mandie Driskill
相关产品推荐
相关产品推荐

