Python 二维数组排序未得到预期正确结果问题求助
问题原因
sorted()函数不会修改原输入数组,只会返回新的排序后数组,你代码中没有接收sorted()的返回值,直接打印原数组,首先就无法得到排序结果。- 你数组中第二列的元素都是字符串类型,默认排序使用字典序对比规则,而非数值大小规则。比如字符串对比时
'939.00000000' < '94.00000000'会判定为真,因为逐字符对比到第二位时'3' < '4'就直接返回结果,不会按照数值939>94的逻辑判断,这是排序结果不符合预期的核心原因。
解决方法
方案1:Python原生实现
修正排序逻辑,将第二列元素转为float类型做数值排序,同时接收sorted()返回值即可:
from operator import itemgetter import pprint arr=[['0.55070000', '879.00000000'], ['0.55350000', '879.00000000'], ['0.55640000', '879.00000000'], ['0.56210000', '879.00000000'], ['0.56490000', '879.00000000'], ['0.56780000', '879.00000000'], ['0.57060000', '879.00000000'], ['0.54500000', '899.00000000'], ['0.56370000', '901.00000000'], ['0.53070000', '908.00000000'], ['0.57350000', '916.00000000'], ['0.55000000', '9172.00000000'], ['0.56300000', '939.00000000'], ['0.54490000', '94.00000000'], ['0.56040000', '96.00000000'], ['0.54960000', '999.00000000']] # 接收sorted返回的排序后数组,key中把第二列转为float做数值对比 sorted_arr = sorted(arr,key=lambda x:float(x[1])) pprint.pprint(sorted_arr)
如果需要直接修改原数组,可以使用列表自带的sort()方法实现原地排序:
arr.sort(key=lambda x:float(x[1])) pprint.pprint(arr)
方案2:Numpy实现
你注释中的Numpy方案需要注意将数组转为数值类型再排序,修正后代码如下:
import numpy as np arr=[['0.55070000', '879.00000000'], ['0.55350000', '879.00000000'], ['0.55640000', '879.00000000'], ['0.56210000', '879.00000000'], ['0.56490000', '879.00000000'], ['0.56780000', '879.00000000'], ['0.57060000', '879.00000000'], ['0.54500000', '899.00000000'], ['0.56370000', '901.00000000'], ['0.53070000', '908.00000000'], ['0.57350000', '916.00000000'], ['0.55000000', '9172.00000000'], ['0.56300000', '939.00000000'], ['0.54490000', '94.00000000'], ['0.56040000', '96.00000000'], ['0.54960000', '999.00000000']] columnIndex = 1 # 转为float类型的numpy数组再排序 arr2D = np.array(arr, dtype=np.float64) sortedArr = arr2D[arr2D[:,columnIndex].argsort()] print('Sorted 2D Numpy Array') print(sortedArr)
内容的提问来源于stack exchange,提问作者Syed Mokarrom Hossain
相关产品推荐
相关产品推荐

