如何在Python中对含数字与字母的列表按数值逆序排序?
Python 实现类似 bash
sort -k 的按列数值排序 当然可以!Python 里完全能实现和 bash sort -k 等价的按指定列数值排序功能,而且有几种灵活的方式,刚好解决你遇到的字符串无法按数值排序的问题。
先明确你的场景,你的列表大概是这样的:
my_list = ["10.987|first sentence", "13.87|second sentence", "9.098|third sentence"]
直接用 sorted(my_list, reverse=True) 会按字符串的字符顺序排序,结果不符合预期——因为字符串比较是逐字符对比,"9.098..." 会比 "13.87..." 靠前,这显然不是你要的数值排序逻辑。
方法一:用 Lambda 表达式自定义排序键(最简洁)
这是最直接的方式,对应 bash 里 sort -k1,1nr 的逻辑:
my_list = ["10.987|first sentence", "13.87|second sentence", "9.098|third sentence"] # 按 | 分割后取第一部分转成浮点数作为排序依据,逆序排列 sorted_list = sorted(my_list, key=lambda x: float(x.split('|')[0]), reverse=True) print(sorted_list)
运行后就能得到你想要的结果:
["13.87|second sentence", "10.987|first sentence", "9.098|third sentence"]
解释:
x.split('|')[0]把每个字符串按|拆分,提取出前面的数值部分float(...)将提取的字符串转成浮点数,让排序按数值大小进行reverse=True实现逆序,对应 bashsort的-r参数
如果你的字符串里可能有多余空格(比如 13.87 | second sentence),可以加个 strip() 处理:
key=lambda x: float(x.split('|')[0].strip())
方法二:结合 itemgetter 实现(适合更复杂的排序场景)
你提到尝试过 itemgetter,其实可以先把每个元素转换成包含数值和原字符串的元组,再用 itemgetter 指定排序键:
from operator import itemgetter my_list = ["10.987|first sentence", "13.87|second sentence", "9.098|third sentence"] # 先将每个元素转换为(数值,原字符串)的元组 processed_items = [(float(x.split('|')[0]), x) for x in my_list] # 按元组的第一个元素(数值)逆序排序,再提取原字符串 sorted_list = [item[1] for item in sorted(processed_items, key=itemgetter(0), reverse=True)] print(sorted_list)
这种方法在需要按多列排序时会更方便,比如先按第一列数值逆序,再按第二列字符串顺序,只需要调整 key=itemgetter(0, 1) 即可。
和 bash sort -k 的对应关系
- Python 的
key=lambda x: float(x.split('|')[0])对应 bash 的-k1,1n(指定第1列按数值排序) - Python 的
reverse=True对应 bash 的-r(逆序) - 合起来就等价于 bash 里的
sort -k1,1nr
内容的提问来源于stack exchange,提问作者badner
相关产品推荐
相关产品推荐

