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

如何高效分解含嵌套字典的字典?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:57:37