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

