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
相关产品推荐
相关产品推荐

