Python 中对数据进行排序是非常简单的,其内置了列表 list
的排序方法 sort
,同时还内置了 sorted
方法,不仅可以对 list
排序,还可以对 tuple
和 dict
排序。不仅如此,关于排序 Python 还提供其它的选择,以应对更多的场景,如:heapq
、collection.Counter
。
sort
sort
是对 list
进行原地址排序,也就是改变原有的 list
。因此,不会增加内存的占用,但会产出数据被修改的副作用,很多时候,我们只是想得到排序的结果,而不想改变原数据。
代码示例:
x = [2, 5, 3, 4, 1]
x.sort()
print(x)
[1, 2, 3, 4, 5]
list.sort() 只能应用于列表类型的数据
如果我们想从大到小排序 list
数据,那么这时就需要用到参数 reverse
,来控制升降序。
代码示例:
x = [2, 5, 3, 4, 1]
x.sort(reverse=True)
print(x)
[5, 4, 3, 2, 1]
sorted
sorted
则没有对原数据进行操作,而是构建一个新的数据,这样就保留了原数据,但会增加内存的占用。
不过,sorted
要比 sort
适用更广泛,可以应用于 list
、tuple
和 dict
等数据结构。
代码示例:
x = [2, 5, 3, 4, 1]
y = sorted(x, reverse=True)
print('x:', x)
print('y:', y)
x: [2, 5, 3, 4, 1]
y: [5, 4, 3, 2, 1]
这与 sort
的基础用法很类似,但接下来就是 sorted
强大之处了。
a = {'a': 2, 'b': 5, 'c': 3, 'd': 4, 'e': 1}
b = sorted(a.items(), key=lambda x: x[1], reverse=True)
print(b)
[('b', 5), ('d', 4), ('c', 3), ('a', 2), ('e', 1)]
同样,如果 list
里存储的是 tuple
的话,也可以用 sorted
进行排序。其原理就是把原数据变现成 list
,且其中每个元素也是 list
类似的,因此 sorted
可以对可迭代的数据进行排序。
heapq
有时候,我们需要 动态 地进行排序,快速找出 TOP 的数据,此时 heapq
(堆排序)就可以大显身手了。
代码示例:
import heapq
x = [2, 5, 3, 4, 1]
heap = []
for i in x:
heapq.heappush(heap, i)
# 堆排序
print([heapq.heappop(heap) for _ in range(len(x))])
# 获取最小值,但不弹出
print(heap[0])
[1, 2, 3, 4, 5]
1
这似乎与 sorted
相比并没有什么优势,甚至更繁琐,但如果遇到动态添加数据的时候,它的优势就显现出来了,比如:在线投票,需要实时出现结果。如果用 sorted
排序,那么每次都需要重排,时间复杂度极高。
heapd
可以持续往里面添加,并快速完成新元素的排序。
collection.Counter
在实际的工作中,很多原始数据的结构,并不是我们能直接用 sorted
等排序的类型,需要一些前置的处理工作,而这些工作往往都重复的,所以,Python 为我们提供了 collection.Counter
来优雅处理这类问题。
代码示例:
from collection import Counter
cng = Counter()
words = ['red', 'blue', 'red', 'green', 'red', 'blue']
for word in words:
cnt[word] += 1
print(cnt)
Counter({'red':3, 'blue': 2, 'green': 1})
# 获取前2个
print(cnt.most_common(2))
[('red', 3), ('blue', 2)]
这样就省了很多额外操作的代码,代码也更整洁了,代码量也更少了,也就意味着出错的概率降低了。
最后,安利大家一本掘金小册《深入理解NLP的中文分词:从原理到实践》,让你从零掌握中文分词技术,踏入NLP的大门。
如果因为以上内容对你有所帮助,希望你帮个忙,点个赞、评个论、转个发,多谢多谢!
此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!