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
相关产品推荐
相关产品推荐

