• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python列表排序 list.sort方法和内置函数sorted用法

    很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表.

    这时候就可以使用list.sort方法和内置函数sorted,本文就是介绍list.sort方法和sorted内置函数的使用方法和区别.

    一、list.sort方法

    list.sort方法会就地排序列表,也就是说不会把原列表复制一份。这也是这个方法的返回值是None的原因,提醒您本方法不会新建一个列表。

    在这种情况下返回None其实是Python的一个惯例:如果一个函数或者方法对对象进行的是就地改动,那它就应该返回 None,好让调用者知道传入的参数发生了变动,而且并未产生新的对象。

    来看一下代码:

    # coding=utf-8
    list_a = [1, 2, 8, 3, 7, 9, 5, 7]
    # sort()方法没有返回值
    list_b = list_a.sort()
    print("list_a: ", list_a)
    print('list_b: ', list_b)

    运行结果:

    list_a: [1, 2, 3, 5, 7, 7, 8, 9]
    list_b: None

    用返回None来表示就地改动这个惯例有个弊端,那就是调用者无法将其串联起来。而返回一个新对象的方法则正好相反,它们可以链式调用,从而形成连贯接口。

    二、sorted内置函数

    与 list.sort 相反,内置函数sorted会新建一个列表作为返回值。

    这个方法可以接受任何形式的可迭代对象作为参数,甚至包括不可变序列或生成器,而不管sorted接受的是怎样的参数,它最后都会返回一个列表。

    代码示例:

    list_c = [1, 2, 8, 3, 7, 9, 5, 7]
    # sorted内置函数会返回一个排序后的新列表
    list_d = sorted(list_c)
    print("list_c: ", list_c)
    print('list_d: ', list_d)

    运行结果:

    list_c: [1, 2, 8, 3, 7, 9, 5, 7]
    list_d: [1, 2, 3, 5, 7, 7, 8, 9]

    可以看到,使用内置函数sorted时,返回了一个新的列表,而原列表没有发生改变。

    这有两种好处:

    1.如果我们即需要使用原列表,也需要使用排序后的列表,或者说我们要将一个非列表的可迭代对象排序成列表,sorted都可以做到

    2.有返回值时,我们可以进行链式调用

    # 可以对非列表的可迭代对象排序生成列表
    str_e = 'python'
    list_e = sorted(str_e)
    print(list_e)
     
    # 链式调用
    str_f = '-'.join(sorted(str_e)).upper().split('-')
    print(str_f)

    运行结果:

    ['h', 'n', 'o', 'p', 't', 'y']
    ['H', 'N', 'O', 'P', 'T', 'Y']

    三、关键字参数key和reverse

    不管是 list.sort 方法还是 sorted 函数,都有两个可选的关键字参数:

    key:

    接收一个只有一个参数的函数,这个函数会被用在序列里的每一个元素上,所产生的结果将是排序算法依赖的对比关键字。

    比如说,在对一些字符串排序时,可以用 key=str.lower 来实现忽略大小写的排序,或者是用 key=len 进行基于字符串长度的排序。key的默认值是恒等函数,也就是默认用元素自己的值来排序。

    reverse:

    如果被设定为 True,被排序的序列里的元素会以降序输出(也就是说把最大值当作最小值来排序),reverse的默认值是 False.

    phone = ('HUAWEI', 'OPPO', 'MI', 'MEIZU', 'VIVO')
    # 按长度进行排序
    phone_list = sorted(phone, key=len)
    print(phone_list)
     
    phone_list_re = sorted(phone, key=len, reverse=True)
    print(phone_list_re)

    运行结果:

    ['MI', 'OPPO', 'VIVO', 'MEIZU', 'HUAWEI']
    ['HUAWEI', 'MEIZU', 'OPPO', 'VIVO', 'MI']

    上面的代码中,第一次排序新建了一个按照长度排序的字符串列表。第二次排序是将按长度排序由升序变成了降序。

    细心的您应该可以发现,第二次的结果并不是第一次排序的结果的完全翻转。

    OPPO和VIVO的长度都是4,reverse=True后,它们的相对位置跟第一次排序是一样的。这是什么原因呢?

    sorted和list.sort背后的排序算法都是Timsort,它是一种自适应算法,会根据原始数据的顺序特点交替使用插入排序和归并排序,以达到最佳效率。

    Python的排序算法Timsort是稳定的(知道这一点就可以了),意思是就算两个元素比不出大小,在每次排序的结果里它们的相对位置是固定的。

    因为用到的排序算法是稳定的,也就是说在长度一样时,OPPO和VIVO的相对位置不会改变。

    关于list.sort()方法和sorted内置函数的使用,现在已经掌握了~

    补充:python知识点,列表排序sort()和sorted()的区别?

    sort()是列表类型的方法,只适用于列表;sorted()是内置函数,支持各种容器类型。它们都可以排序,且用法类似,但sort()是在原地排序的,不会返回排序后的列表,而sorted()是返回新的排序列表。

    >>> help(list.sort)
    Help on method_descriptor:
    sort(...)
     L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
    >>> 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.
    

    本文仅简单介绍排序用法。

    例如列表L:

    >>> L = ['python', 'shell', 'Perl', 'Go', 'PHP']

    使用sort()和sorted()排序L,注意sort()是对L直接原地排序的,不是通过返回值来体现排序结果的,所以无需赋值给变量。而sorted()则是返回排序后的新结果,需要赋值给变量才能保存排序结果。

    >>> sorted(L)
    ['Go', 'PHP', 'Perl', 'python', 'shell']
    >>> L
    ['python', 'shell', 'Perl', 'Go', 'PHP']
    >>> L.sort()
    >>> L
    ['Go', 'PHP', 'Perl', 'python', 'shell']
    

    不难发现,sort()和sorted()默认都是升序排序的(AB...Zab...z)。它们都可以指定参数reverse=True来表示顺序反转,也就是默认得到降序:

    >>> L.sort(reverse=True)
    >>> L
    ['shell', 'python', 'Perl', 'PHP', 'Go']

    在python 3.x中,sort()和sorted()不允许对包含不同数据类型的列表进行排序。也就是说,如果列表中既有数值,又有字符串,则排序操作报错。

    sort()和sorted()的另一个参数是key,它默认为key=None,该参数用来指定自定义的排序函数,从而实现自己需要的排序规则。

    例如,上面的列表不再按照默认的字符顺序排序,而是想要按照字符串的长度进行排序。所以,自定义这个排序函数:

    >>> def sortByLen(s):
    ...  return len(s)

    然后通过指定key = sortByLen的参数方式调用sort()或sorted(),在此期间还可以指定reverse = True:

    >>> L = ['shell', 'python', 'Perl', 'PHP', 'Go']
    >>> sorted(L,key=sortByLen)
    ['Go', 'PHP', 'Perl', 'shell', 'python']
    5
    >>> L.sort(key=sortByLen,reverse=True)
    >>> L
    ['python', 'shell', 'Perl', 'PHP', 'Go']
    

    再例如,按照列表每个元素的第二个字符来排序。

    def f(e):
     return e[1]
    L = ['shell', 'python', 'Perl', 'PHP', 'Go']
    sorted(L, key=f)
    L.sort(key=f)
    

    更多的排序方式,比如指定两个排序依据,一个按字符串长度升序排,长度相同的按第2个字符降序排。用法其实很简单,不过稍占篇幅,所以本文不解释了。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • Python入门基本操作列表排序用法详解
    • Python 如何获取目录下的文件列表,并自然排序
    • Python列表排序方法reverse、sort、sorted详解
    • Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
    • Python要如何实现列表排序的几种方法
    • Python 列表排序详解
    上一篇:Python os.mkdir()与os.makedirs()的使用区别
    下一篇:Python 如何限制输出日志的大小
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python列表排序 list.sort方法和内置函数sorted用法 Python,列表,排序,list.sort,