Python 之list.sort方法和内置函数sorted

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZZh1301051836/article/details/83042214

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.2 python sort 函数|菜鸟教程
在这里插入图片描述
在这里插入图片描述

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 官方中文文档

猜你喜欢

转载自blog.csdn.net/ZZh1301051836/article/details/83042214
今日推荐