python list 排序的两种方法及实例讲解

对 list 进行排序,Python 提供了两个方法:

方法1. 用 list 的内建函数 list.sort 进行排序

list.sort(func=None, key=None, reverse=False)

Python实例:

>>> L = [2,5,8,9,3]  
>>> L  
[2,5,8,9,3]  
>>> L.sort()  
>>> L  
[2, 3, 5, 8, 9]

方法2. 用序列类型函数 sorted(list) 进行排序

(从 python 2.4 开始)

Python实例:

>>> L = [2,5,8,9,3]  
>>> L  
[2,5,8,9,3]  
>>> sorted(L)  
[2, 3, 5, 8, 9]

两种方法的区别:

  • sorted(list) 返回一个对象,可以用作表达式。原来的 list 不变,生成一个新的排好序的 list 对象。
  • list.sort() 没有返回值,直接改变原有的 list。

其他sort的实例:

实例1:正向排序

>>>L = [2,3,1,4]
>>>L.sort()
>>>L
>>>[1,2,3,4]

实例2:反向排序

>>>L = [2,3,1,4]
>>>L.sort(reverse=True)
>>>L
>>>[4,3,2,1]

实例3:对第二个关键字排序

>>>L = [('b',6),('a',1),('c',3),('d',4)]
>>>L.sort(lambda x,y:cmp(x[1],y[1])) 
>>>L
>>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]

实例4:对第二个关键字排序

>>>L = [('b',6),('a',1),('c',3),('d',4)]
>>>L.sort(key=lambda x:x[1]) 
>>>L
>>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]

实例5:对第二个关键字排序

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>import operator
>>>L.sort(key=operator.itemgetter(1)) 
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

实例6:DSU方法(Decorate-Sort-Undercorate)

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
>>>A.sort()
>>>L = [s[2] for s in A]
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

以上给出了6种对 list 排序的方法,其中实例3、4、5、6能够以 list 中 item 的某一项作为比较关键字进行排序。

效率比较:

cmp < DSU < key

通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当。

多关键字比较排序:

实例7:

>>>L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:x[1])
>>> L
>>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]

我们看到,此时排序过的 L 是仅仅按照第二个关键字来排的。

如果我们想用第二个关键字排过序后再用第一个关键字进行排序呢?

两种方法:

实例8:

>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:(x[1],x[0]))
>>> L
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

实例9:

>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=operator.itemgetter(1,0))
>>> L
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

为什么实例8能够工作呢?原因在于 tuple 的比较是从左到右进行的,比较完第一项,如果相等,再比较第二项。

转自:http://blog.chinaunix.net/uid-20775448-id-4222915.html

本文分享自微信公众号 - Crossin的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang语言社区--【基础知识】语言数组

Go编程语言提供称为数组的数据结构,其可存储相同类型的元素的一个固定大小的连续集合。数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合。...

35490
来自专栏斑斓

Scala中的偏函数

艺术地说,Scala中的Partial Function就是一个“残缺”的函数,就像一个严重偏科的学生,只对某些科目感兴趣,而对没有兴趣的内容弃若蔽履。Part...

38240
来自专栏木子昭的博客

Python中 传递值 与 传递引用 的区别

对于不可变类型传递值(不会影响原数据) ? 不可变类型 对于可变类型传递引用(会影响原数据) ? 不可变类型传递引用 pyth...

41590
来自专栏微信公众号:Java团长

Java抽象类与oop三大特征

在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它 只有声明,而没有具体的实现 。抽象方法的声明格式为:

15340
来自专栏诸葛青云的专栏

手把手教你c语言基础语法——结构体

在前面已经介绍了整形(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储一组具有相同类型的数据),字符串。但是...

17900
来自专栏Java3y

归并排序就这么简单

归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是归并排序,希望大家看完能够理解并手写出归并排序快速排序的代码,然后...

66870
来自专栏JMCui

浅析多线程的对象锁和Class锁

一、前言 本来想在另外一篇文章说的,发现可能篇幅有点大,所以还是另开一篇博文来说好了。知识参考《Java多线程编程核心技术》,评价下这本书吧——大量的代码,简单...

39260
来自专栏Python爬虫与数据挖掘

Python正则表达式初识(二)

前几天给大家分享了Python正则表达式初识(一),介绍了正则表达式中的三个特殊字符“^”、“.”和“*”,感兴趣的伙伴可以戳进去看看,今天小编继续给大家分享P...

9110
来自专栏从零开始学 Web 前端

从零开始学 Web 之 JavaScript(二)变量

基础数据类型: String,Number,Boolean,unsigned、null

9930
来自专栏积累沉淀

JavaScript对象和数组

学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型。而对象的值就是引用类型的实例。 一...

33450

扫码关注云+社区

领取腾讯云代金券