Python列表按指定列排序未达预期的问题排查
问题
将逗号分隔的CSV文件加载为Python列表后,希望让用户选择某一列,按该列数值大小对整个列表排序。使用sort()方法和sorted()函数均未得到预期结果,问题出在哪里?
以选择第2列(Logged GDP per capita)为例:
原代码
#My code: #This is liked csv-input of #wData.csv file: wData=[['Country name','Ladder score','Logged GDP per capita','Social support','Healthy life expectancy','Freedom to make life choices','Generosity','Perceptions of corruption'],['Finland','7.804','10.792','0.969','71.150','0.961','0.019','0.182'],['Denmark','7.586','10.962','0.954','71.250','0.934','0.134','0.196'],['Iceland','7.530','10.896','0.983','72.050','0.936','0.211','0.668'],['Israel','7.473','10.639','0.943','72.697','0.809','-0.023','0.708'],['Netherlands','7.403','10.942','0.93','71.550','0.887','0.213','0.379'],['Sweden','7.395','10.883','0.939','72.150','0.948','0.165','0.202'],['Norway','7.315','11.088','0.943','71.500','0.947','0.141','0.283'],['Switzerland','7.240','11.164','0.92','72.900','0.891','0.027','0.266'],['Luxembourg','7.228','11.660','0.879','71.675','0.915','0.024','0.345'],['India','4.036','8.759','0.608','60.777','0.897','0.072','0.774'],['Madagascar','4.019','7.290','0.65','58.050','0.522','0.075','0.742'],['Lebanon','2.392','9.478','0.53','66.149','0.474','0.141','0.891'],['Afghanistan','1.859','7.324','0.341','54.712','0.382','-0.081','0.847']] #print(wData) print('What column to evaluate? ') kolumn=int(input()) lander=[] varden=[] vardenAttVisa=8 nrPostLista = (len(wData)-1) wData.sort(key=lambda x: x[int(kolumn)], reverse=False) #sorted(WHR1Data,key=lambda x: x[kolumn]) for k in range(0,nrPostLista): print(f'|{{wData[k+1][0]: <20}} {"|": >4}{{wData[k+1][kolumn]}}{"|": >13}') lander.append(wData[k+1][0]) varden.append(wData[k+1][kolumn])
当前输出
|Finland |10.792 | |Sweden |10.883 | |Iceland |10.896 | |Netherlands |10.942 | |Denmark |10.962 | |Norway |11.088 | |Switzerland |11.164 | |Luxembourg |11.660 | |Madagascar |7.290 | |Afghanistan |7.324 | |India |8.759 | |Lebanon |9.478 | |Country name |Logged GDP per capita |
预期输出
|Luxembourg |11,660 | |Switzerland |11,164 | |Norway |11,088 | |Denmark |10,962 | ... |Madagascar |7,290 |
错误原因
- 字符串字典序排序:列表中所有数值都是字符串类型(如
'10.792'),sort()默认按字符串字典序比较,导致'10...'排在'7...'前面——因为字符'1'的ASCII码小于'7'。 - 表头参与排序:直接对整个
wData列表排序,表头行(第一行)也被纳入排序逻辑,最终出现在输出末尾,不符合需求。 - 排序方向不符:预期是降序(从大到小),但代码中用了
reverse=False(升序)。
修正后的代码
# CSV数据加载后的列表 wData=[['Country name','Ladder score','Logged GDP per capita','Social support','Healthy life expectancy','Freedom to make life choices','Generosity','Perceptions of corruption'],['Finland','7.804','10.792','0.969','71.150','0.961','0.019','0.182'],['Denmark','7.586','10.962','0.954','71.250','0.934','0.134','0.196'],['Iceland','7.530','10.896','0.983','72.050','0.936','0.211','0.668'],['Israel','7.473','10.639','0.943','72.697','0.809','-0.023','0.708'],['Netherlands','7.403','10.942','0.93','71.550','0.887','0.213','0.379'],['Sweden','7.395','10.883','0.939','72.150','0.948','0.165','0.202'],['Norway','7.315','11.088','0.943','71.500','0.947','0.141','0.283'],['Switzerland','7.240','11.164','0.92','72.900','0.891','0.027','0.266'],['Luxembourg','7.228','11.660','0.879','71.675','0.915','0.024','0.345'],['India','4.036','8.759','0.608','60.777','0.897','0.072','0.774'],['Madagascar','4.019','7.290','0.65','58.050','0.522','0.075','0.742'],['Lebanon','2.392','9.478','0.53','66.149','0.474','0.141','0.891'],['Afghanistan','1.859','7.324','0.341','54.712','0.382','-0.081','0.847']] print('请选择要排序的列序号:') kolumn = int(input()) # 分离表头与数据行 header = wData[0] data_rows = wData[1:] # 按指定列的数值降序排序:将字符串转为浮点型 data_rows.sort(key=lambda x: float(x[kolumn]), reverse=True) # 输出排序结果,适配预期格式 for row in data_rows: # 把小数点替换为逗号 formatted_value = row[kolumn].replace('.', ',') print(f'|{row[0]: <12} |{formatted_value} |')
关键修正说明
- 分离表头:单独提取第一行表头,仅对数据行排序,避免表头干扰结果。
- 数值类型转换:排序时用
float(x[kolumn])将字符串转为浮点型,实现真正的数值大小比较。 - 调整排序方向:设置
reverse=True实现降序排列,匹配预期输出的顺序。 - 格式适配:将数值中的小数点替换为逗号,和预期输出的格式一致。
内容的提问来源于stack exchange,提问作者jappen78
相关产品推荐
相关产品推荐

