Python中的排序方法sort()和sorted()的区别和几个比较实用的操作。
排序应该是处理list列表经常用到的方法,常用的就是sort和sorted。
一、两者的差异
1、list.sort()是list是内建方法,使用sort会直接改变原列表的顺序,而sorted(list)只会返回一个已排好序的列表,如下:
1 >>> a = ['a1', 'a2', 'a3', 'a11', 'a21']
2 >>> a.sort()
3 >>> a
4 ['a1', 'a11', 'a2', 'a21', 'a3']
5 >>> b = ['b1', 'b2', 'b3', 'b11', 'b21']
6 >>> sorted(b)
7 ['b1', 'b11', 'b2', 'b21', 'b3']
8 >>> b
9 ['b1', 'b2', 'b3', 'b11', 'b21']
2、sorted()可用于任何一个可迭代的对象,比如:
>>> members
[('Mark', 30, 12000), ('John', 24, 6000), ('Tim', 27, 8000), ('David', 26, 10000)]
>>> sorted(members)
[('David', 26, 10000), ('John', 24, 6000), ('Mark', 30, 12000), ('Tim', 27, 8000)]
sorted首先选择了每个成员的第一个变量进行了排序。
二、实用的操作
sort()方法和sorted()函数都内置了一个key参数,用与在进行比较前指定每个元素上要调用的函数。这里就可以脑洞大开了。
1、大部分情况下,我们并不想看到类似下面这种排序:
1 >>> sorted(b)
2 ['b1', 'b11', 'b2', 'b21', 'b3']
这是默认以字符进行排序的,而我们期望的结果往往是类似于['b1', 'b2', 'b3', 'b11', 'b21']的自然排序结果。这里就可以用key来调整。
1 >>> sorted(b, key=lambda n : int(n[1:]))
2 ['b1', 'b2', 'b3', 'b11', 'b21']
3 >>> sorted(b, key=lambda n : int(n[1:]), reverse=True)
4 ['b21', 'b11', 'b3', 'b2', 'b1']
排序将按整数的大小进行,也可以加入reverse来控制逆序。
2、key也可用来控制排序的对象
>>> members
[('Mark', 30, 12000), ('John', 24, 6000), ('Tim', 27, 8000), ('David', 26, 10000)]
>>> sorted(members)
[('David', 26, 10000), ('John', 24, 6000), ('Mark', 30, 12000), ('Tim', 27, 8000)]
>>> sorted(members, key=lambda n: n[2])
[('John', 24, 6000), ('Tim', 27, 8000), ('David', 26, 10000), ('Mark', 30, 12000)]
上例就是按收入(成员第3项)进行排序的。也可以先按年龄,再按收入进行排序:
>>> sorted(members, key=lambda n: (n[1], n[2]))
[('John', 24, 6000), ('David', 26, 10000), ('Tim', 27, 8000), ('Mark', 30, 12000)]
3、最骚气的当然是引入一些内库了,比如operator模块
- operator.itemgetter() 通过下标
- operator.attrgetter() 通过参数
这里只举个简单的例子,有兴趣的话可以去搜一搜具体的操作方法。
1 >>> from operator import itemgetter, attrgetter
2 >>> sorted(members, key=itemgetter(1))
3 [('John', 24, 6000), ('David', 26, 10000), ('Tim', 27, 8000), ('Mark', 30, 12000)]