Python中按row分组并按col升序排序字典列表的实现方案
解决字典列表按
row分组、组内按col排序的问题 我来帮你搞定这个问题!你的需求很清晰,咱们先梳理下核心目标:
- 按
row值对字典分组(row取值范围1-12) - 每组内的字典按
col值升序排序 - 最终生成一个按row顺序排列、组内col有序的新列表
先看你当前代码的问题
你在循环range(1,13)时,没有每次清空list_to_sort,导致后续的row组会包含之前row的元素;而且最后没有把排序好的每组正确合并到最终列表里,这才卡住了。
正确实现方案
这里提供两种方式,逻辑清晰且能满足你的需求:
方式一:用collections.defaultdict分组(更简洁)
from collections import defaultdict # 你的待排序列表 mson = [ {'col': 10, 'row': 1, 'size_x': 3, 'size_y': 3}, {'col': 1, 'row': 1, 'size_x': 3, 'size_y': 2}, {'col': 5, 'row': 1, 'size_x': 2, 'size_y': 2}, {'col': 1, 'row': 3, 'size_x': 3, 'size_y': 2}, {'col': 1, 'row': 5, 'size_x': 2, 'size_y': 2}, {'col': 1, 'row': 7, 'size_x': 3, 'size_y': 2}, {'col': 8, 'row': 4, 'size_x': 3, 'size_y': 3.0}, {'col': 6, 'row': 7, 'size_x': 3, 'size_y': 2} ] # 第一步:按row值分组,把相同row的字典放到同一个列表里 grouped = defaultdict(list) for obj in mson: grouped[obj['row']].append(obj) # 第二步:按row顺序(1-12)处理每组,组内按col升序排序后合并 mson_sorted = [] for row_num in range(1, 13): # 获取当前row对应的字典列表,没有则返回空列表 row_objects = grouped.get(row_num, []) # 组内按col值升序排序 sorted_row = sorted(row_objects, key=lambda x: x['col']) # 把排序后的列表追加到最终结果里 mson_sorted.extend(sorted_row) # 验证输出(和你的期望完全一致) for item in mson_sorted: print(item)
方式二:不用额外模块(纯基础字典实现)
如果你不想导入defaultdict,用普通字典也能实现:
# 你的待排序列表 mson = [ # 同上... ] # 按row值分组 grouped = {} for obj in mson: row = obj['row'] if row not in grouped: grouped[row] = [] grouped[row].append(obj) # 生成最终排序列表 mson_sorted = [] for row_num in range(1, 13): if row_num in grouped: # 组内按col升序排序 sorted_row = sorted(grouped[row_num], key=lambda x: x['col']) mson_sorted.extend(sorted_row)
核心逻辑说明
- 分组:先把所有字典按
row归类,避免重复遍历整个列表12次,逻辑和效率都更优 - 按顺序处理:遍历1-12的row值,确保最终列表的row顺序完全符合要求
- 组内排序:对每个row组里的字典,用
lambda x: x['col']作为排序键,实现col升序 - 合并结果:用
extend把每组排序后的列表拼接成最终的一维列表,和你的输入格式一致
内容的提问来源于stack exchange,提问作者Rookie_123
相关产品推荐
相关产品推荐

