python list sort

本文介绍了Python中使用sorted函数和list.sort方法进行排序的高级技巧,包括如何利用key参数提高效率,如何通过lambda表达式和operator模块简化多级排序,以及如何区分sorted与list.sort的不同应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from: http://blog.youkuaiyun.com/horin153/article/details/7076321 

在 Python 中, 当需要对一个 list 排序时, 一般可以用 list.sort() 或者 sorted(iterable[, cmp[, key[, reverse]]]).
其中:
cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即用内建的比较函数.
key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.
reverse 是一个布尔值, 表示是否反转比较结果.

 我以前在做比较复杂的排序时, 喜欢写一个定制的 cmp 函数. 当我看了 Python 文档后, 发现我的做法是不好的. 简单说明如下:

[python]  view plain copy
  1. 1, 通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次.  
  2. 也就是说, 同等情况下, 写 key 函数比写 cmp 函数要高效很多.  
  3.   
  4. 2, 对一些貌似比较复杂的排序, 也是不需要写 cmp 函数的, 举例如下:  
  5. >>> students = [('john''A'15), ('jane''B'12), ('dave''B'10),]  
  6.   
  7. 用元素索引做 key:  
  8. >>> sorted(students, key=lambda student: student[2])   # sort by age  
  9. [('dave''B'10), ('jane''B'12), ('john''A'15)]  
  10.   
  11. 用元素已经命名的属性做 key:  
  12. >>> sorted(students, key=lambda student: student.age)   # sort by age  
  13. [('dave''B'10), ('jane''B'12), ('john''A'15)]  
  14.   
  15. 用 operator 函数来加快速度, 上面两个排序等价于:  
  16. >>> from operator import itemgetter, attrgetter  
  17. >>> sorted(students, key=itemgetter(2))  
  18. >>> sorted(students, key=attrgetter('age'))  
  19.   
  20. 用 operator 函数进行多级排序, 这个就是比较复杂的应用. 按我以前的理解, 是一定要写个定制的 cmp 函数的. 现在看来, 以前真的够笨.  
  21. # sort by grade then by age  
  22. >>> sorted(students, key=itemgetter(1,2))  
  23. [('john''A'15), ('dave''B'10), ('jane''B'12)]  
  24. >>> sorted(students, key=attrgetter('grade''age'))  
  25. [('john''A'15), ('dave''B'10), ('jane''B'12)]  
  26.   
  27. 3, 根据字典值排序  
  28. >>> d = {'a':2'b':23'c':5'd':17'e':1}  
  29.   
  30. #1, 返回 pair 对:  
  31. from operator import itemgetter  
  32. >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)  
  33. [('b'23), ('d'17), ('c'5), ('a'2), ('e'1)]  
  34.   
  35. #2, 仅返回 keys:  
  36. >>> sorted(d, key=d.__getitem__, reverse=True)  
  37. ['b''d''c''a''e']  
  38.   
  39. 4, sorted() 会返回一个新的已经排好序的 list.  
  40. list.sort() 是就地排序, 以节约空间, 当然就不会返回一个排好序的新的 list 了. 这对大的 list 排序是有空间优势的.  

 

Python中,对列表进行排序可以通过多种方式实现,主要包括使用列表对象的 `sort()` 方法、使用内置的 `sorted()` 函数以及其他自定义排序方法。 ### 使用 `sort()` 方法 列表对象提供了一个 `sort()` 方法,该方法直接修改原始列表,按照升序对元素进行排序。例如: ```python cars = ['bmw', 'audi', 'toyota', 'subaru'] cars.sort() print(cars) # 输出: ['audi', 'bmw', 'subaru', 'toyota'] ``` 如果需要降序排序,则可以传递参数 `reverse=True`: ```python cars.sort(reverse=True) print(cars) # 输出: ['toyota', 'subaru', 'bmw', 'audi'] ``` ### 使用 `sorted()` 函数 `sorted()` 是Python的内置函数,它不会修改原始列表,而是返回一个新的排序后的列表。例如: ```python cars = ['bmw', 'audi', 'toyota', 'subaru'] sorted_cars = sorted(cars) print(sorted_cars) # 输出: ['audi', 'bmw', 'subaru', 'toyota'] ``` 同样,`sorted()` 也支持 `reverse` 参数以实现降序排序: ```python sorted_cars_desc = sorted(cars, reverse=True) print(sorted_cars_desc) # 输出: ['toyota', 'subaru', 'bmw', 'audi'] ``` ### 自定义排序规则 对于更复杂的排序需求,可以结合 `key` 参数来定义排序规则。例如,通过 `lambda` 表达式对字符串长度进行排序: ```python words = ['apple', 'banana', 'cherry', 'date'] sorted_words = sorted(words, key=lambda x: len(x)) print(sorted_words) # 输出: ['date', 'apple', 'cherry', 'banana'] ``` 此外,还可以使用 `operator` 模块中的函数,如 `itemgetter()` 或 `attrgetter()` 来对多维列表或对象列表进行排序。 ### 使用 NumPy 进行数值排序 当处理数值数据时,可以使用 NumPy 提供的排序功能,它支持更高效的数值计算。例如: ```python import numpy as np numbers = np.array([3, 1, 4, 1, 5, 9]) sorted_numbers = np.sort(numbers) print(sorted_numbers) # 输出: [1 1 3 4 5 9] ``` 这些方法涵盖了从基本到复杂的应用场景,每种方法都有其适用的场景和优势[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值