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

合并同键多个子dictionary时key 'b'出现多余元素,求问题原因

问题分析与解决

问题根源

你遇到的key 'b'出现多余元素的问题,核心原因是可变列表的引用传递:

  • 初始化d1和d2时,字典中的值直接指向fruits和cars原列表的引用,而非独立的新列表。
  • 第一次循环后,d['b']与原cars列表共享同一内存地址。
  • 处理d2的key 'a'时,fruits.extend(cars)直接修改了原fruits列表(此时d2['b']仍指向这个被修改的fruits)。
  • 后续处理key 'b'时,cars.extend(d2['b'])等价于把已经包含cars元素的fruits追加到cars里,导致d['b']多出了重复的Ford, BMW, Volvo。

解决方法

只需切断字典值与原列表的引用关联,创建列表副本即可,以下两种方式都能解决:

方式一:初始化字典时创建列表副本

fruits = ['apple', 'banana', 'cherry']
cars = ['Ford', 'BMW', 'Volvo']

d = {}
# 用list()或切片[:]生成原列表的副本
d1 = {'a': list(fruits), 'b': list(cars)}
d2 = {'a': list(cars), 'b': list(fruits)}
l = [d1, d2]

for i in l:
    if not d:
        d.update(i)
    else:
        for k in d.keys():
            d[k].extend(i[k])

print(f"{d=}")

方式二:初始化合并字典时创建副本

fruits = ['apple', 'banana', 'cherry']
cars = ['Ford', 'BMW', 'Volvo']

d = {}
d1 = {'a': fruits, 'b': cars}
d2 = {'a': cars, 'b': fruits}
l = [d1, d2]

for i in l:
    if not d:
        # 对第一个字典的所有值创建副本,避免引用原列表
        d = {k: list(v) for k, v in i.items()}
    else:
        for k in d.keys():
            d[k].extend(i[k])

print(f"{d=}")

运行任意一种代码,都会得到预期输出:

d={'a': ['apple', 'banana', 'cherry', 'Ford', 'BMW', 'Volvo'], 'b': ['Ford', 'BMW', 'Volvo', 'apple', 'banana', 'cherry']}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:08:12