You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:12:09