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

Python实现:含重复键字典创建与字典列表分组转换

嘿,我来帮你搞定这两个Python字典处理的问题!咱们一个一个来:

问题1:按unique键聚合duplicate值成列表

这个需求其实就是把相同unique值对应的duplicate值收集到列表里,我给你两种实现方式,一种是基础写法,另一种用内置工具简化代码。

基础实现(不用额外库)

def aggregate_duplicates(input_list):
    # 临时字典:key是unique的值,value是对应的duplicate列表
    temp_map = {}
    for item in input_list:
        unique_id = item['unique']
        dup_val = item['duplicate']
        # 如果当前unique_id还没记录,先初始化空列表
        if unique_id not in temp_map:
            temp_map[unique_id] = []
        temp_map[unique_id].append(dup_val)
    # 把临时字典转成你要的列表格式
    return [{'unique': k, 'duplicates': v} for k, v in temp_map.items()]

# 测试你的示例输入
sample_input = [
    {'unique':1, 'duplicate':2},
    {'unique':1, 'duplicate':8},
    {'unique':2, 'duplicate':2},
    {'unique':1, 'duplicate':4}
]
print(aggregate_duplicates(sample_input))
# 输出:[{'unique': 1, 'duplicates': [2, 8, 4]}, {'unique': 2, 'duplicates': [2]}]

简洁版(用collections.defaultdict)

如果不想写判断键是否存在的逻辑,可以用Python标准库的defaultdict,它会自动为不存在的键创建默认值(这里是空列表):

from collections import defaultdict

def aggregate_duplicates(input_list):
    temp_map = defaultdict(list)
    for item in input_list:
        temp_map[item['unique']].append(item['duplicate'])
    return [{'unique': k, 'duplicates': v} for k, v in temp_map.items()]
问题2:创建包含重复键的字典

首先得明确:Python标准的dict是不允许重复键的,当你插入相同键时,后面的值会直接覆盖前面的。比如:

test_dict = {'a': 1, 'a': 2}
print(test_dict)  # 输出:{'a': 2}

如果需要存储重复键的键值对,有几种实用的方案:

方案1:用列表存储所有键值对

最简单的方式就是用列表存元组,把每个键值对都保留下来:

key_value_pairs = [('a', 1), ('a', 2), ('b', 3)]

之后如果需要按键取所有对应值,就用问题1里的方法转换成“键对应值列表”的字典就行。

方案2:自定义支持重复键的字典类

如果你想要一个能直接处理重复键的“字典”,可以自己写个简单的类,支持存重复键、按键取所有值、遍历所有键值对:

class MultiDict:
    def __init__(self):
        self._items = []
    
    def __setitem__(self, key, value):
        # 添加键值对,不覆盖旧的
        self._items.append((key, value))
    
    def __getitem__(self, key):
        # 返回该键对应的所有值的列表
        return [val for k, val in self._items if k == key]
    
    def __iter__(self):
        # 遍历所有键值对(包括重复键)
        return iter(self._items)

# 使用示例
md = MultiDict()
md['a'] = 1
md['a'] = 2
md['b'] = 3

print(md['a'])  # 输出:[1, 2]
for k, v in md:
    print(k, v)
# 输出:
# a 1
# a 2
# b 3

方案3:用第三方库的MultiDict

如果你的项目用了Web框架(比如Flask),很多框架自带支持重复键的MultiDict,比如Werkzeug库的实现:

from werkzeug.datastructures import MultiDict

md = MultiDict()
md.add('a', 1)
md.add('a', 2)
md.add('b', 3)

print(md.getlist('a'))  # 输出:[1, 2]

需要先安装Werkzeug:pip install werkzeug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:07:53