定义:

sorted() 函数对所有可迭代的对象进行排序操作。

内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

语法:

sorted 语法:

sorted(iterable, cmp=None, key=None, reverse=False)
复制代码

**返回值:**返回重新排序的列表。

参数说明:

  • iterable -- 可迭代对象
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。无论是 sort() 还是 sorted() 函数,传入参数 key 比传入参数 cmp 效率要高。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

**cmp()**函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1

语法:

cmp( x, y )
复制代码

参数:

  • x -- 数值表达式。
  • y -- 数值表达式。

**reverse()**函数:用于反向列表中元素。

语法:

list.reverse()
复制代码

该方法没有返回值,但是会对列表的元素进行反向排序。

sorted 的使用方法:

1、默认情况下,sorted 函数将按列表升序进行排序,并返回一个新列表对象,原列表保持不变,最简单的排序。

>>> nums = [3,4,5,2,1]
>>> sorted(nums)
[1, 2, 3, 4, 5]
复制代码

2、降序排序,如果要按照降序排列,只需指定参数 reverse=True 即可

>>> sorted(nums, reverse=True)
[5, 4, 3, 2, 1]
复制代码

3、如果要按照某个规则排序,则需指定参数 key, key 是一个函数对象,例如字符串构成的列表,我想按照字符串的长度来排序

>>> chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']

>>> sorted(chars, key=len)
['a', 'is', 'from', 'test', 'This', 'Andrew', 'string']
复制代码

len 是内建函数,sorted 函数在排序的时候会用len去获取每个字符串的长度来排序。 有些人可能使用匿名函数 key=lambda x: len(x) ,

4、如果是一个复合的列表结构,例如由元组构成的列表,要按照元组中的第二个元素排序,那么可以用 lambda 定义一个匿名函数。

>>> students = [('zhang', 'A'), ('li', 'D'), ('wang', 'C')]
>>> sorted(students, key=lambda x: x[1])
[('zhang', 'A'), ('wang', 'C'), ('li', 'D')]
复制代码

这里将按照字母 A-C-D 的顺序排列。

如果要排序的元素是自定义类,例如Student类按照年龄来排序,则可以写成

>>>a = [5,7,6,3,4,1,2]
>>> b = sorted(a) # 保留原列表
>>> a
[5, 7, 6, 3, 4, 1, 2]
>>> b
[1, 2, 3, 4, 5, 6, 7] >>> L=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)] >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>>
复制代码

6、和数据库的排序一样,sorted 也可以根据多个字段来排序,例如我有先要根据age排序,如果age相同的则根据grade排序,则可以使用元组:

>>> sorted(student_objects, key=lambda t:(t.age, t.grade))
[('dave', 'B', 10), ('lily', 'A', 12), ('jane', 'B', 12), ('john', 'A', 15)]
复制代码

7、同样的,对于自定义类,也有一种更高效的方法指定key

>>> from operator import attrgetter
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
复制代码

如果参与排序的字段有两个怎么办?

>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
复制代码

8、前面碰到的排序场景都是建立在两个元素是可以互相比较的前提下,例如数值按大小比较, 字母按顺序比较。

如果遇到本身是不可比较的,需要我们自己来定义比较规则的情况如何处理呢?

>>> nums = [2, 1.5, 2.5, '2', '2.5']
>>> sorted(nums)
TypeError: '<' not supported between instances of 'str' and 'int'
复制代码

一个整数列表中,可能有数字,字符串,在Python3中,字符串与数值是不能比较的,而Python2中任何类型都可以比较,这是两个版本中一个很大的区别:

# python2
>>> "2.5" > 2
True # python3
>>> "2.5" > 2
TypeError: '>' not supported between instances of 'str' and 'int'
复制代码

9、关于 sorted 函数,当遇到需要自定义比较操作的数据,Python2和Python3之间的区别是:

Python2中的sorted 可以指定cmp关键字参数,可以通过 cmp=compare 来实现,

Python3中还需要导入functools.cmp_to_key实现

sorted()函数使用范围:

  • 对字典进行排序(中根据字典的值进行排序)
  • 多维list排序
  • 字典中混合list排序
  • List 中混合字典排序
  • 对字符串进行排序

sort()与sorted()的区别

1、相比于 sort(),sorted() 使用的范围更为广泛,两者的函数形式分别如下:

sorted(iterable[, cmp[, key[, reverse]]])
s.sort([cmp[, key[, reverse]]])
复制代码

2、sorted() 作用于任意可迭代的对象,而 sort()一般作用于列表。

>>> a = (1,2,4,2,3)
>>> a.sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'sort'
>>> sorted(a)
[1, 2, 2, 3, 4]
复制代码

下面的例子中针对元组使用 sort() 方法会抛出 AttributeError,而使用 sorted() 函数则 没有这个问题。

3、当排序对象为列表的时候两者适合的场景不同。sorted() 函数会返回一个排序后的列表,原有列表保持不变;而 sort() 函数会直接修改原有列表,永久改变,无法返回,函数返回为 None。

>>> a=['1',1,'a',3,7,'n']
>>> sorted(a)
[1, 3, 7, '1', 'a', 'n']
>>> a
['1', 1, 'a', 3, 7, 'n']
>>> print a.sort()
None
>>> a
[1, 3, 7, '1', 'a', 'n']
复制代码

如果实际应用过程中需要保留原有列表,使用 sorted() 函数较为适合,否则可以选择sort() 函数,因为 sort() 函数不需要复制原有列表,消耗的内存较少,效率也较高。

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!

Python小白干货宝典:sorted()函数:列表元素排序的更多相关文章

  1. Python中sort与sorted函数

    python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的序列都是适用的: 并且sort()函数是内置函数,会改变当前对象,而sorted()函 ...

  2. Python中sort和sorted函数代码解析

    Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...

  3. python sorted函数多条件排序是怎么回事

    首先,要知道sorted 内部实现使用了归并排序,而归并排序是稳定的排序,就是说当元素比不出大小时,其相对位置是不变的. 那么,利用稳定排序的特性,key函数有几个返回值就排序几次,先排序次要条件,后 ...

  4. Python map/reduce/filter/sorted函数以及匿名函数

    1. map() 函数的功能: map(f, [x1,x2,x3]) = [f(x1), f(x2), f(x3)] def f(x): return x*x a = map(f, [1, 2, 3, ...

  5. python基础一 ------如何统计一个列表元素的频度

    如何统计一个列表元素的频度 两个需求: 1,统计一个随机序列[1,2,3,4,5,6...]中的出现次数前三的元素及其次数 2,统计一片英文文章中出现次数前10 的单词 两种方法: 1,普通的for循 ...

  6. Python中sort以及sorted函数初探

    sorted(...) Help on built-in function sorted in module __builtin__: sorted(...) sorted(iterable, cmp ...

  7. python内置数据类型-字典和列表的排序 python BIT sort——dict and list

    python中字典按键或键值排序(我转!)   一.字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序. Py ...

  8. Python 中 如何将两个列表元素一一对应成字典

    使用python的 zip函数 和强大的集合操作可以方便的将两个list元素一一对应转换为dict,如下示例代码: names = ['n1','n2','n3'] values = [1,2,3] ...

  9. python学习(五)之列表元素的积

    前几天,学完python的列表之后,我们老师留了一道关于列表的题目.几天后,老师讲解习题,很荣幸成为被老师点名讲解自己代码的其中之一下面把我的想法分享一下. 描述一个由n(n>1)个数字组成的列 ...

随机推荐

  1. Spring中各个模块

    Spring中个模块介绍 核心模块 ​ 提供了对Bean的配置.管理.创建等以及IOC/DI.如果只需要提供IOC/DI功能,只需要引入Beans和Core两个jar包 Core 包含Spring框架 ...

  2. C语言讲义——数组和指针

    数组名表示的是这个数组的首地址.即如果有int a[10],则a 相当于&a[0]. #include <stdio.h> main() { int a[5]= {1,3,5,7, ...

  3. django搭建完毕运行显示hello django

    1.使用pycharm打开工程,进入工程配置解释器路径 2.视图和url 视图:处理我们从业务的地方,可以理解为函数 url:进行路由匹配的地方,先在主工程bookpro中进行匹配,如果匹配ok,那么 ...

  4. 09_消息通知Toast和Notification

    1. Toast 学习创建长短不一的Toast提示,并自定义Toast在屏幕上的位置以及Toast的外观. 1 package com.example.toastdemo; 2 3 import an ...

  5. Django 多对多表的三种创建方式

    第一种: class Book(models.Model): name = models.CharField(max_length=32) # 第一种自动创建 authors = models.Man ...

  6. PriorityQueue 优先队列的实现

    PriorityQueue 的 implementation PriorityQueue即是优先队列.通俗的说就是体育课的时候老师要求从高到低排序,老师能直接一眼看出谁是最高的在班级里.当这个最高的离 ...

  7. 一千行MySQL命令

    基本操作 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_p ...

  8. Mysql-索引分析查询性能

    explain 全文只有一个关键点,那就是explain,explain 显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.简单讲,它的作用就 ...

  9. PyQt(Python+Qt)学习随笔:QDateEdit日期编辑部件和QTimeEdit时间编辑部件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 Designer输入部件中,Date Edit和T ...

  10. PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性

    老猿Python博文目录 老猿Python博客地址# 一.概述 defaultDropAction属性用于控制QAbstractItemView及其子类的实例视图中拖放时放下的默认操作.该属性的类型为 ...