@TOC# python中如何对列表进行排序


文章目录

  • 前言
  • 一、使用List成员函数List.sort()
  • 二、使用内置函数Sorted()
  • 三、使用Heapq-堆队列算法



前言

list是python语言中经常使用的数据类型,在代码实现中,会经常涉及到对其进行排序处理,这里对经常使用的一些方法进行了总结。


一、使用List成员函数List.sort()

>>> help(list.sort)
Help on method_descriptor:

sort(...)
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
注:一般来说,cmp和key可以使用lambda表达式。

使用举例如下:

lstA=[9,4,5,1,3]
lstB=[(9,4),(4,5),(5,1),(1,3),(3,9)]

lstA.sort()
lstB.sort(key=lambda x:x[1],reverse=False)#按照第二项值进行升序排列

print lstA
print lstB

[1, 3, 4, 5, 9]
[(5, 1), (1, 3), (9, 4), (4, 5), (3, 9)]

lstB.sort(key=lambda x:x[0],reverse=True)#按照第一项值进行降序排列
print lstB
[(9, 4), (5, 1), (4, 5), (3, 9), (1, 3)]

二、使用内置函数Sorted()

>>> help(sorted)
Help on built-in function sorted in module __builtin__:

sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

iterable:是可迭代类型,这个无需多言;
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值,默认升序。
返回值:是一个经过排序的可迭代类型,与iterable一样。
注:一般来说,cmp和key可以使用lambda表达式。sorted函数同样可对

sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。

使用举例如下:

lstA=[9,4,5,1,3]
lstB=[(9,4),(4,5),(5,1),(1,3),(3,9)]

print sorted(lstA)
[1, 3, 4, 5, 9]
print sorted(lstB,key=lambda x:x[1],reverse=True)#按照第二项值进行降序排列
[(3, 9), (4, 5), (9, 4), (1, 3), (5, 1)]

三、使用Heapq-堆队列算法

Heaq这个模块提供了堆队列算法的实现,也称为优先队列算法。主要函数如下:
heapq.heappush(heap, item) 将 item 的值加入 heap 中,保持堆的不变性
heapq.heappop(heap) 弹出并返回 heap 的最小的元素,保持堆的不变性。如果堆为空,抛出 IndexError 。使用 heap[0] ,可以只访问最小的元素而不弹出它。
heapq.heappushpop(heap, item) 将 item 放入堆中,然后弹出并返回 heap 的最小元素。该组合操作比先调用 heappush() 再调用 heappop() 运行起来更有效率。
heapq.heapify(x) 将list x 转换成堆,原地,线性时间内。
heapq.nlargest(n, iterable[, key]) 从可迭代对象中,返回最大的n个元素
heapq.nsmallest(n, iterable[, key]) 从可迭代对象中,返回最小的n个元素

利用堆队列算法实现对于列表的排序:

import heapq

lstA=[9,4,5,1,3]
lstB=[(9,4),(4,5),(5,1),(1,3),(3,9)]

print heapq.nsmallest(len(lstA),lstA)
print heapq.nsmallest(len(lstB),lstB,key=lambda x:x[1])#按照第二项值进行降序排列

[1, 3, 4, 5, 9]
[(5, 1), (1, 3), (9, 4), (4, 5), (3, 9)]

def heapsort(lst):#使用list数据构造堆
    rst=[]
    for x in lst:
        heapq.heappush(rst,x)
    return[ heapq.heappop(rst) for i in range(len(rst))]

print heapsort(lstA)
print heapsort(lstB)

[1, 3, 4, 5, 9]
[(1, 3), (3, 9), (4, 5), (5, 1), (9, 4)]

def heapsort(lst):#直接将list转换为堆
    heapq.heapify(lst)
    return[ heapq.heappop(lst) for i in range(len(lst))]
print heapsort(lstA)
print heapsort(lstB)

[1, 3, 4, 5, 9]
[(1, 3), (3, 9), (4, 5), (5, 1), (9, 4)]