Python 构建重复整数键对应多值聚合字典的实现方法
问题根因说明
Python原生字典的键具备唯一性约束,直接使用dict(zip(binaries, positions))生成字典时,相同键的历史值会被后续值完全覆盖,最终每个键仅能存储遍历过程中最后匹配的位置值,完全无法实现按键聚合的需求。
推荐实现方案(符合Python字典规范的聚合形式)
这种形式也是你提到的第二种期望效果,是工程场景下的通用标准做法:将相同键对应的所有位置值聚合为列表,作为字典的单个值存储。
原生字典实现
不需要引入第三方依赖,通过遍历逐次追加值即可完成聚合:
binaries = [1,1,1,1,1,1,0] positions = [[200,110,10,50],[200,170,10,50],[150,220,50,10],[140,170,10,50],[140,110,10,50],[150,100,50,10],[150,160,50,10]] grouped_result = {} for key, pos in zip(binaries, positions): # 键不存在时先初始化空列表,存在则直接追加对应位置值 if key not in grouped_result: grouped_result[key] = [] grouped_result[key].append(pos)
最终生成的字典结构为:
{ 1: [[200,110,10,50], [200,170,10,50], [150,220,50,10], [140,170,10,50], [140,110,10,50], [150,100,50,10]], 0: [[150,160,50,10]] }
更简洁的内置工具实现
使用Python标准库的collections.defaultdict,可以省去键存在性的判断逻辑,代码更精简:
from collections import defaultdict grouped_result = defaultdict(list) for key, pos in zip(binaries, positions): grouped_result[key].append(pos) # 如需转回原生普通字典,可直接做类型转换: dict(grouped_result)
关于“支持重复键的字典形式”的说明
Python内置的所有字典结构从语法层面就不支持同键重复存储:就算在代码字面量里写重复键,Python解释器也会自动把同键的前序值覆盖,根本无法生成类似{1: 值1, 1: 值2}的结构。
如果确实需要保留所有原始键值对的对应关系、不做聚合,可以直接将zip生成的键值对转成列表存储,本质上是一组带映射关系的元组序列:
# 保留所有重复键、匹配原始顺序的键值序列 kv_sequence = list(zip(binaries, positions))
最终存储的结构为[(1, [200,110,10,50]), (1, [200,170,10,50]), ..., (0, [150,160,50,10])],不存在字典的键唯一性约束,但是这种结构不属于字典类型,无法通过键直接快速索引对应值。
内容的提问来源于stack exchange,提问作者Azeem8869786
相关产品推荐
相关产品推荐

