排序应该是处理list列表经常用到的方法,常用的就是sort和sorted。
一、两者的差异
1、list.sort()是list是内建方法,使用sort会直接改变原列表的顺序,而sorted(list)只会返回一个已排好序的列表,如下:
1 >>> a = ['a1', 'a2', 'a3', 'a11', 'a21']2 >>>a.sort()3 >>>a4 ['a1', 'a11', 'a2', 'a21', 'a3']5 >>> b = ['b1', 'b2', 'b3', 'b11', 'b21']6 >>>sorted(b)7 ['b1', 'b11', 'b2', 'b21', 'b3']8 >>>b9 ['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 importitemgetter, attrgetter2 >>> sorted(members, key=itemgetter(1))3 [('John', 24, 6000), ('David', 26, 10000), ('Tim', 27, 8000), ('Mark', 30, 12000)]