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)]