面试中,排序真的是个经久不衰的问题,最近专门研究了一下python3中的排序函数:sorted()。写出来跟大家一起学习一下。
在python3中,对sorted()的定义是:
>>> help(sorted)
Help on built-in function sorted in module builtins:
sorted(iterable, /, *, key=None, reverse=False)
Return a new list containing all items from the iterable in ascending order.
A custom key function can be supplied to customize the sort order, and the
reverse flag can be set to request the result in descending order.
简言之:
- sorteda()是一个用来排序的内建函数;
- 它返回一个新的对象;
- 它接收三个参数:
iterable:一个可迭代对象(列表、元组、字符串);
key=None:排序关键字,可以提供自定义键函数来自定义排序顺序
reverse=False:是否反转(是否为按降序请求结果)
用法如下:
list = [1, 4, 3, 2]
print(sorted(list) # [1, 2, 3, 4]
print(sorted(list, reverse=True)) # [4, 3, 2, 1]
# 这里顺便再比较一下sorted()与sort()方法的区别:
sorted(list) # [1, 2, 3, 4]
print(list) # [1, 4, 3, 2]
list.sort() # [1, 2, 3, 4]
print(list) # [1, 2, 3, 4]
# 可见,sort()方法直接改变了原数据,而sorted()则是生成了新的数据,不会对原数据进行修改。
参数key的用法,则是比较高级的用法。我们知道,更多情况下,数据并不是一维的,二是形如:[(1, 9), (2, 8), (3, 7)]这样二维或者多维的数据,以此为例,思考这样一个问题:如何按照列表里每一个元组的第二位为基准进行排序?
# key的使用方法:
list = [(1, 9), (2, 8), (3, 7)]
print(sorted(list, key=lambda x:x[1]), reverse=False) # [(3, 7), (2, 8), (1, 9)]
# 再来试试字典:
dict = {'a': 3, 'b': 2, 'c': 1}
print(sorted(dict.items(), key=lambda x:x[1], reverse=False)) # [('c', 1), ('b', 2), ('a', 3)]
"""
这里注意一下,字典本质上是一个无序的容器对象,3.6版本以后支持有序,但这个有序是按照键的添加顺序,如果要对字典的键或值排序,一般是先转为list,再按照键值排序。这里的dict.items()就是把字典转成键值对的列表,实质上还是对列表排序。关于更多的字典的操作,我会专门写一点关于字典的博客。
"""