1 list.sort()
介绍:该方法会就地排序列表,不会把原列表复制一份。
程序示例:
li = [5,1,2,4,6,3,5,6]
li.sort()
print(li)
执行结果:
[1, 2, 3, 4, 5, 5, 6, 6]
2 内置函数sorted()
关于该函数,笔者按“应用”——>“原理”的顺序进行介绍,介绍内容分别学习自《流畅的Python》、python sort 函数|菜鸟教程、Built-in Functions Python sorted 官方英文文档、Built-in Functions Python sorted 官方中文文档。
sorted()源码:cpython/bltinmodule.c
2.1 《流畅的Python》
2.1.1 list.sort()和Python内置函数sorted()的区别
- 参数比较
list.sort()仅能用于列表,而sorted()可以用于任何形式的可迭代对象,甚至包括不可变序列或生成器。 - 返回值比较
list.sort()返回值是None,用于提醒开发者本方法不会新建一个列表。好让调用者知道传入的参数发生了变动,而且并未产生新的对象。
2.1.1 list.sort()和sorted()的参数介绍
两个函数的参数列表相同,都具有三个参数:一个必要参数,两个可选参数。
(1)第一个参数 iterable
需要传入一个待排序的对象。
对于list.sort(),就是一个列表(List)
对于sorted(),就是一个任何形式的可迭代对象或不可变序列或生成器。
(2)第二个参数key
需要传入一个函数。
若不传入函数,该参数的默认值是恒等函数(identity function),即默认用元素自己的值来排序。
该函数的特点是:
- 只有一个参数;
- 这个函数会被用在序列中的每一个元素上;
- 所产生的结果将是算法依赖额对比关键字;
程序示例1:
# 获取列表(在下面,takeSecond(elem)实际时对元组进行操作。但是只要不修改元组,便意味着像对列表一样操作元组)的第二个元素
def takeSecond(elem):
return elem[1]
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
random.sort(key=takeSecond)
# 过程详解:
# takeSecond分别处理列表random的四个元素(即四个元组),取出每个元组的第二个(elem[0]是第一个)元素。
# 得到2,4,1,3。
# 然后,列表类型的函数list.sort(),按照数字2,3,4,1的大小,对他们对应的(random中)的每个元素 进行排序
# 得到(4,1),(2,2),(1,3),(3,4)
# 故而使用random.sort(key=takeSecond)对random进行排序后,新的random为:
# random = [(4,1),(2,2),(1,3),(3,4)]。
# 输出类别
print '排序列表:', random
执行结果:
排序列表: [(4, 1), (2, 2), (1, 3), (3, 4)]
类似的一个参数的key函数,还有lower()、len() 等。
(3)第三个参数 reverse
需要传入一个布尔值, True or False
reverse,译:反转
所以若reverse为True,表示真的颠倒了顺序(倒序),即从大到小排序。
若reverse为False,表示没有颠倒顺序,即从小到大排序。
2.3 Built-in Functions Python sorted 官方英文文档
建议打开标题链接,详细查看其中的functools.cmp_to_key()和Sorting HOW TO。下面是functools.cmp_to_key()的源代码。
def cmp_to_key(mycmp):
"""Convert a cmp= function into a key= function"""
class K(object):
__slots__ = ['obj']
def __init__(self, obj):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
__hash__ = None
return K
try:
from _functools import cmp_to_key
except ImportError:
pass
2.4 Built-in Functions Python sorted 官方中文文档
3 list.sort() 和 内置函数sorted()的区别
Sorting HOW TO 官方英文版,看其中的Sorting Basics 模块。(Sorting HOW TO 官方中文版)
参考文献
[1] 《流畅的Python》Luciano Ramalho 著 安道 吴珂译
[2] python sort 函数|菜鸟教程
[3] Built-in Functions Python sorted 官方英文文档
[4] Built-in Functions Python sorted 官方中文文档