列表排序
最基本的排序函数有sort(),和sorted()函数两种。sort是列表的内置函数,而sorted可以作用于所有的可迭代对象。
a = [3,5,7,4,2,8,0]
b = [3,5,7,4,2,8,0]
print(a)
a.sort()
print(a)
[3, 5, 7, 4, 2, 8, 0]
[0, 2, 3, 4, 5, 7, 8]
print(b)
b_s = sorted(b)
print(b)
print(b_s)
[3, 5, 7, 4, 2, 8, 0]
[3, 5, 7, 4, 2, 8, 0]
[0, 2, 3, 4, 5, 7, 8]
通过上面的例子可以看到,sort改变原来的列表,inplace=True;而sorted产生新的列表。
默认排序升序,可以通过reverse参数设置降序,默认升序为False。
a = [3,5,7,4,2,8,0]
b = (3,5,7,4,2,8,0)
print(a)
a.sort(reverse=True)
print(a)
[3, 5, 7, 4, 2, 8, 0]
[8, 7, 5, 4, 3, 2, 0]
b.sort()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in ()
----> 1 b.sort()
AttributeError: 'tuple' object has no attribute 'sort'
sorted(b)
[0, 2, 3, 4, 5, 7, 8]
元祖使用sort()函数会报错,可以使用sorted()函数进行排序。
键排序
现实中会使用复杂的数据结构,最简单的比如字典,或者包含多个列,我们现在想按其中的一列进行排序。
上面的简单的列表排序就不能适应,这个时候就要使用键排序了。
#示例1:#用一个元组表示一条记录,记录一个人的姓名,ID,年龄。然后我们使用不同的域(姓名,ID,年龄)来对域进行排序。employee_records = [('joe',1,52),('bech',2,26),('ele',6,32),('neo',3,45)]#使用姓名进行排序print(sorted(employee_records,key = lambda emp:emp[0]))
[('bech', 2, 26), ('ele', 6, 32), ('joe', 1, 52), ('neo', 3, 45)]
#使用ID进行排序print(sorted(employee_records,key = lambda emp:emp[1]))
[('joe', 1, 52), ('bech', 2, 26), ('neo', 3, 45), ('ele', 6, 32)]
#使用年龄进行排序print(sorted(employee_records,key = lambda emp:emp[2]))
[('bech', 2, 26), ('ele', 6, 32), ('neo', 3, 45), ('joe', 1, 52)]
上面使用了lambda函数进行了域的传递,也可以使用python中快捷的函数进行访问键。这里介绍operator模块的itemgetter。
from operator import itemgetter
employee_records = [('joe',1,52),('bech',2,26),('ele',6,32),('neo',3,45)]#使用姓名进行排序print(sorted(employee_records,key = itemgetter(0)))
[('bech', 2, 26), ('ele', 6, 32), ('joe', 1, 52), ('neo', 3, 45)]
#使用ID进行排序print(sorted(employee_records,key = itemgetter(1)))
[('joe', 1, 52), ('bech', 2, 26), ('neo', 3, 45), ('ele', 6, 32)]
#使用年龄进行排序print(sorted(employee_records,key = itemgetter(2)))
[('bech', 2, 26), ('ele', 6, 32), ('neo', 3, 45), ('joe', 1, 52)]
多级排序,比如线用姓名,再用年龄。代码如下:
print(sorted(employee_records,key = itemgetter(0,2)))
[('bech', 2, 26), ('ele', 6, 32), ('joe', 1, 52), ('neo', 3, 45)]
如果迭代对象是类元素,使用operator模块中的,attrgetter和methodcaller函数。这里不做详述。
参考:《python数据科学指南》