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

Python中字典内列表按值降序排序及大字典循环优化

优化大规模字典中关联项按对应值降序排序的代码

我有一个规模极大的JSON格式字典数据,结构如下(示例):

json_data = {
    '0': {'related_items': [6, 7], 'values': [0.8111071056538126, 0.8660254037844388]},
    '1': {'related_items': [5, 8], 'values': [0.9999999999999998, 0.7071067811865475]},
    '222': {'related_items': [], 'values': []},
    '33': {'related_items': [], 'values': []},
    '44': {'related_items': [99], 'values': [0.7071067811865475]},
    '5': {'related_items': [1, 8], 'values': [0.9999999999999998, 0.7071067811865475]},
    '6': {'related_items': [0, 7, 99], 'values': [0.8111071056538126, 0.936585811581694, 0.8111071056538126]},
    '7': {'related_items': [0, 6, 99], 'values': [0.8660254037844388, 0.936585811581694, 0.8660254037844388]},
    '8': {'related_items': [1, 5], 'values': [0.7071067811865475, 0.7071067811865475]},
    '99': {'related_items': [44, 6, 7], 'values': [0.7071067811865475, 0.8111071056538126, 0.8660254037844388]}
}

需求是将每个子字典中的related_items列表按照对应的values列表降序排序,比如键'0'排序后应为:{'0': {'related_items': [7, 6], 'values': [0.8660254037844388,0.8111071056538126]}}。

我当前使用的循环代码如下:

for i, j in json_data.items():
    r = j['related_items']
    s = j['values']
    if r:
        sim_final, rel_final = (list(t) for t in zip(*sorted(zip(s, r),reverse=True)))
        json_data[i]['values']=sim_final
        json_data[i]['related_items']=rel_final

预期输出结果为:

{
    '0': {'related_items': [7, 6], 'values': [0.8660254037844388, 0.8111071056538126]},
    '1': {'related_items': [5, 8], 'values': [0.9999999999999998, 0.7071067811865475]},
    '222': {'related_items': [], 'values': []},
    '33': {'related_items': [], 'values': []},
    '44': {'related_items': [99], 'values': [0.7071067811865475]},
    '5': {'related_items': [1, 8], 'values': [0.9999999999999998, 0.7071067811865475]},
    '6': {'related_items': [7, 99, 0], 'values': [0.936585811581694, 0.8111071056538126, 0.8111071056538126]},
    '7': {'related_items': [6, 99, 0], 'values': [0.936585811581694, 0.8660254037844388, 0.8660254037844388]},
    '8': {'related_items': [5, 1], 'values': [0.7071067811865475, 0.7071067811865475]},
    '99': {'related_items': [7, 6, 44], 'values': [0.8660254037844388, 0.8111071056538126, 0.7071067811865475]}
}

由于实际处理的字典规模极大,请问如何简化上述for循环代码?


优化方案

针对大规模数据,我们可以从减少中间变量、简化逻辑、利用Python内置高效特性入手,同时兼顾可读性和性能。这里提供两种实用优化方向:

1. 原地修改:简化循环逻辑,减少内存开销

直接操作原字典的条目,去掉不必要的中间变量,既简洁又能降低内存占用,适合超大规模数据场景:

for key, entry in json_data.items():
    if entry['related_items']:
        # 按values降序排序关联对,再解包回两个列表
        sorted_pairs = sorted(zip(entry['values'], entry['related_items']), reverse=True)
        entry['values'], entry['related_items'] = map(list, zip(*sorted_pairs))

这种写法砍掉了原代码中r、s、sim_final、rel_final四个中间变量,直接通过entry对象修改原数据,避免了额外的内存引用,性能更优。

2. 字典推导式:生成新字典(适合不需要修改原数据的场景)

如果需要保留原字典,生成一个全新的排序后字典,可以用字典推导式让代码更紧凑:

sorted_json_data = {
    key: {
        'related_items': list(rels) if rels else [],
        'values': list(vals) if vals else []
    } for key, entry in json_data.items()
    for vals, rels in [sorted(zip(entry['values'], entry['related_items']), reverse=True)]
}

注意:这种方式会创建新字典,对于超大规模数据可能占用双倍内存,内存紧张时优先选择第一种原地修改方案。

优化逻辑的优势

  • 原地修改方案内存效率极高,不需要额外存储整个新字典,适合处理TB级别的数据。
  • 两种方案都利用了Python内置的sorted和zip的高效底层实现,避免了手动排序的冗余代码。
  • map(list, zip(*...))替代原生成器表达式,在处理大量元素时,map的执行效率略高于生成器。

如果追求极致性能,还可以考虑用pandas批量处理,但纯Python场景下,上述两种方案已经足够简洁高效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:19:25