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

如何使用Python将包含重复值的两个列表合并为保留重复键的字典

如何在Python中保留重复键将列表转为字典?

嘿,我来帮你捋清楚这个问题~首先得明确一点:Python的标准字典是不支持重复键的,你期望的{1:1, 2:2, 2:3, 4:4, 4:4, 5:5, 6:6}这种结构在Python里是没法直接创建的——因为当字典里出现重复键时,后面的键值对会自动覆盖前面的,这也是为什么你用dict(zip(a,b))会得到去重后的结果。

不过没关系,我们可以用几种替代方案来实现“保留所有键值对应关系”的需求,看你实际场景选哪种:

方法一:用键值对列表直接存储(最直观)

如果不需要严格的字典类型,只是想保留所有a和b的对应关系,直接把zip的结果转成列表就行:

a = [1,2,2,4,4,5,6]
b = [1,2,3,4,4,5,6]
result = list(zip(a, b))
print(result)  # 输出: [(1, 1), (2, 2), (2, 3), (4, 4), (4, 4), (5, 5), (6, 6)]

这种方式完全保留了所有配对信息,后续遍历、筛选都很方便。

方法二:用defaultdict把重复键映射到值列表

要是你还是想用字典结构,想通过键获取所有对应的取值,可以用collections里的defaultdict来实现:

from collections import defaultdict

a = [1,2,2,4,4,5,6]
b = [1,2,3,4,4,5,6]

result_dict = defaultdict(list)
for key, value in zip(a, b):
    result_dict[key].append(value)

print(dict(result_dict))  
# 输出: {1: [1], 2: [2, 3], 4: [4, 4], 5: [5], 6: [6]}

这样每个键对应的是所有匹配的值的列表,既保留了所有信息,又能享受字典的键查找便利。

方法三:自定义支持重复键的字典类(进阶玩法)

如果你真的需要一个“看起来”有重复键的字典结构,可以自己写一个简单的子类,重写赋值逻辑——不过要注意,这种字典在和其他依赖键唯一性的代码交互时可能会出问题,谨慎使用:

class DuplicateKeyDict(dict):
    def __setitem__(self, key, value):
        # 键已存在时,把值转为列表并添加新元素
        if key in self:
            if isinstance(self[key], list):
                self[key].append(value)
            else:
                super().__setitem__(key, [self[key], value])
        else:
            super().__setitem__(key, value)

a = [1,2,2,4,4,5,6]
b = [1,2,3,4,4,5,6]

result = DuplicateKeyDict()
for k, v in zip(a, b):
    result[k] = v

print(result)  
# 输出: {1: 1, 2: [2, 3], 4: [4, 4], 5: 5, 6: 6}

总的来说,根据你的实际需求选对应的方案就好啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:27:37