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

Python嵌套列表排序问题:按数值排序且同数值按字母排序

解决嵌套列表按数值+字母排序的问题

首先看你代码里的几个小问题,先帮你捋清楚:

  • 创建numpy数组时,得用np.array()而非np.array[],括号才是调用函数的正确方式;
  • numpy里压根没有np.sorted()这个方法,正确的是np.sort(),但更关键的是:把字符串和数字塞进同一个numpy数组时,所有元素会被自动转成字符串类型,这时候按x[1]排序就变成了字符串比较(比如"56"和"67"会按字符顺序比,逻辑上就错了);
  • 就算用numpy的sort,它的排序参数用法和Python内置sorted完全不一样,不能直接传lambda当key。

方法一:用Python内置sorted()函数(推荐)

这个方法更直观,也不会有类型转换的坑,直接指定排序规则就行:

先修正你的原始数据(注意字符串要加引号哦):

students = [['ram', 67], ['Sam', 56], ['don', 67], ['tom', 78], ['Raul', 54]]

然后排序:我们需要先按数值(第二个元素)升序,数值相同时按名字(第一个元素)升序。这里把key设为元组(x[1], x[0].lower()),用lower()是为了忽略大小写排序(避免大写字母莫名排在前面):

sorted_students = sorted(students, key=lambda x: (x[1], x[0].lower()))
print(sorted_students)

输出结果:

[['Raul', 54], ['Sam', 56], ['don', 67], ['ram', 67], ['tom', 78]]

如果想让数值降序、名字仍升序,不用直接加reverse=True(会同时反转两个条件),把数值取负数就行:

sorted_students = sorted(students, key=lambda x: (-x[1], x[0].lower()))

方法二:用numpy处理(适合大规模数据)

如果你一定要用numpy,得用结构化数组来区分不同类型的字段,这样才能指定多条件排序:

import numpy as np

# 创建结构化数组,明确指定字段类型:名字是字符串,分数是整数
students = np.array([('ram', 67), ('Sam', 56), ('don', 67), ('tom', 78), ('Raul', 54)],
                   dtype=[('name', 'U10'), ('score', int)])

# 按score升序,再按name升序排序
sorted_students = np.sort(students, order=['score', 'name'])
print(sorted_students)

输出结果:

[('Raul', 54) ('Sam', 56) ('don', 67) ('ram', 67) ('tom', 78)]

要是想忽略大小写排序,得先给数组加个小写名字的字段:

# 添加小写名字字段
students['lower_name'] = np.char.lower(students['name'])
# 按score升序、lower_name升序排序
sorted_students = np.sort(students, order=['score', 'lower_name'])
# 去掉临时的lower_name字段再输出
sorted_students = sorted_students[['name', 'score']]
print(sorted_students)

这样就能得到和纯Python方法一致的忽略大小写排序结果啦。

内容的提问来源于stack exchange,提问作者Shivam Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:07:50