如何高效分解含嵌套字典的字典?Python分组优化方案问询
按嵌套字典的
type值分组原字典的键 我有一个包含数千个键的字典,每个键对应一个嵌套字典,示例如下:
original_dict = { 'H0JKYXRWSN0D': {'type': 'A', 'name': '5GJ3VT3P'}, 'T3W8Z1G3ZJFS': {'type': 'B', 'name': '2QNVJGM6'}, 'ZJ7VYG1J33FJ': {'type': 'B', 'name': 'UJV0LEH2'}, 'DK0MBF8N4H1S': {'type': 'A', 'name': '8X0JBY1R'}, 'DZC6UHTQ93UO': {'type': 'C', 'name': '83B4FLJ3'} }
目标是按唯一的type值,将原字典的键分组为对应列表,预期输出:
{'A': ['H0JKYXRWSN0D', 'DK0MBF8N4H1S'], 'B': ['T3W8Z1G3ZJFS', 'ZJ7VYG1J33FJ'], 'C': ['DZC6UHTQ93UO']}
已经实现了基础的for循环方案,但想找更高效的内置函数实现方式。
方法1:使用collections.defaultdict
这是最实用的替代方案,能简化空列表的初始化逻辑,代码更简洁,效率和原生for循环接近(大量数据下甚至略优,减少了重复的键存在性检查):
from collections import defaultdict def create_lists_by_type(dictionary): lists_by_type = defaultdict(list) for key, value in dictionary.items(): lists_by_type[value['type']].append(key) return dict(lists_by_type) # 可选:转成普通字典返回
defaultdict会自动为不存在的键创建指定类型的默认值(这里是list),省去了手动判断键是否存在的步骤,代码更紧凑。
方法2:使用itertools.groupby
如果先对原字典的项按type排序,就可以用groupby分组,但注意**groupby要求输入是已排序的迭代器**,否则会把同类型但不连续的项分成不同组:
from itertools import groupby def create_lists_by_type(dictionary): # 先按type排序原字典的项 sorted_items = sorted(dictionary.items(), key=lambda x: x[1]['type']) # 按type分组,提取每个组的键 return { type_key: [key for key, _ in group_items] for type_key, group_items in groupby(sorted_items, key=lambda x: x[1]['type']) }
注意:这种方法因为需要先排序,时间复杂度是O(n log n),而前两种方法是O(n),所以百万级以上的大数据场景下,前两种方法效率更高。但如果你的数据本身已经按type排序,groupby会非常高效。
效率对比
- 原生for循环和
defaultdict的时间复杂度都是O(n),defaultdict代码更简洁,实际运行中因内部优化,性能和原生循环几乎一致,甚至略好。 groupby适合小数据或已排序的数据,大数据下不如前两种高效。
内容的提问来源于stack exchange,提问作者sergey_208
相关产品推荐
相关产品推荐

