排序是编程是最常遇到的场景了,今天分享一个小技巧,可以让 Python 排序的速度有所提升。你看完可以收藏备用。
通常,我们要排序的数据并不是纯数字或纯字母,而是各种数据类型的混合,比如要排序的数据可能是这个样子:
代码语言:javascript复制data = [('c',3),('b',1),('a',2)]
默认情况下,排序按照列表元素的第一个值进行的排序:
代码语言:javascript复制In [6]: data = [('c',3),('b',1),('a',2)]
In [7]: sorted(data)
Out[7]: [('a', 2), ('b', 1), ('c', 3)]
In [8]:
如果要按照第二个值进行排序,则需要传入一个 lambda 函数,来指定要排序的 key:
代码语言:javascript复制In [8]: data = [('c',3),('b',1),('a',2)]
In [9]: sorted(data,key = lambda x:x[1])
Out[9]: [('b', 1), ('a', 2), ('c', 3)]
In [10]:
现在,你可以不用 lambda 函数,而是使用 itemgetter 函数,而且速度更快。
itemgetter 函数可以生成高效的 getter 函数版本,可以与 sorted() 函数结合使用以提高排序操作的性能。
上面的代码就可以写成这样:
代码语言:javascript复制In [11]: from operator import itemgetter
In [12]: data = [('c',3),('b',1),('a',2)]
In [13]: sorted(data,key = itemgetter(1))
Out[13]: [('b', 1), ('a', 2), ('c', 3)]
你可能好奇,itemgetter 是如何工作的?那么请看下面的代码:
代码语言:javascript复制In [14]: item = ('c',3)
In [15]: getter = itemgetter(1)
In [16]: getter(item)
Out[16]: 3
In [17]: getter = itemgetter(0)
In [18]: getter(item)
Out[18]: 'c'
In [19]: item = {'c':3}
In [22]: getter = itemgetter('c')
In [23]: getter(item)
Out[23]: 3
itemgetter() 是 Python 标准库的一部分,向 itemgetter() 传递一个参数,这个参数或者是索引位置,或者是字典的键,然后 itemgetter() 函数将返回一个可以调用的 getter 对象。
现在让我们来测试一下 lambda 和 itemgetter 在排序时,到底哪个更高效?
从上面的结果可以看出,使用 itemgetter() 更高效。
最后的话
如果要排序的数据比较大,那就用 itemgetter 吧,丢弃 key = lambda... 。如果有收获,还请点赞、关注、转发。