Python二维数组多列确定性数值排序及通用列组合实现
Python二维数组多列层级排序方案
原始数组
arr = [[130, 175, 75, 152], [96, 132, 122, 112], [174, 218, 141, 196], [661, 701, 21, 683], [707, 746, 375, 724], [957, 998, 305, 980], [768, 806, 26, 788], [957, 998, 394, 974], [768, 806, 286, 787], [174, 218, 328, 194], [894, 933, 80, 914], [130, 175, 182, 152], [96, 132, 329, 114], [894, 933, 166, 913]]
期望排序结果
[[96, 132, 122, 112], [96, 132, 329, 114], [130, 175, 75, 152], [130, 175, 182, 152], [174, 218, 141, 196], [174, 218, 328, 194], [661, 701, 21, 683], [707, 746, 375, 724], [768, 806, 26, 788], [768, 806, 286, 787], [894, 933, 80, 914], [894, 933, 166, 913], [957, 998, 305, 980], [957, 998, 394, 974]]
问题解答
1. 如何进行数值排序(而非字典序)?
Python中整数的比较逻辑本身就是基于数值大小的,list.sort()默认会按元素的自然顺序排序——对于二维数组,默认会依次比较子数组的每个元素(先第0列,再第1列,以此类推),这和你需要的层级排序逻辑完全一致,且是数值排序而非字典序。
如果想要更明确地指定排序依据(避免依赖默认行为),可以通过key参数显式指定排序的列:
# 按第0列→第1列→第2列的顺序数值排序 arr.sort(key=lambda x: (x[0], x[1], x[2]))
执行后数组会直接变成你期望的结果,这里的排序完全基于数值大小,不存在字典序问题。
2. 如何针对任意列组合实现通用排序?
只需要将排序的列索引组合作为参数传入key函数即可,还可以封装成通用函数方便复用:
def sort_2d_array(arr, column_indices): """ 对二维数组按指定列组合层级排序 :param arr: 待排序的二维数组 :param column_indices: 排序优先级的列索引列表,如[0,1,2]表示先按第0列,再按第1列,最后按第2列 """ arr.sort(key=lambda x: tuple(x[col] for col in column_indices)) # 示例:按第2列→第0列排序 sort_2d_array(arr, [2, 0]) # 示例:按第1列→第3列排序 sort_2d_array(arr, [1, 3])
这种方式可以灵活支持任意列的组合排序,排序逻辑始终是数值比较,结果完全确定。
内容的提问来源于stack exchange,提问作者skeetastax
相关产品推荐
相关产品推荐

