Python中对各种数据结构:列表、元组、字典(list、tuple、dict)进行排序,sort、sorted、heapq、Counter

Python 中对数据进行排序是非常简单的,其内置了列表 list 的排序方法 sort,同时还内置了 sorted 方法,不仅可以对 list 排序,还可以对 tupledict 排序。不仅如此,关于排序 Python 还提供其它的选择,以应对更多的场景,如:heapqcollection.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 适用更广泛,可以应用于 listtupledict 等数据结构。

代码示例:

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的大门。

如果因为以上内容对你有所帮助,希望你帮个忙,点个赞、评个论、转个发,多谢多谢!

此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!
惠惠周刊

发布了9 篇原创文章 · 获赞 13 · 访问量 2188

猜你喜欢

转载自blog.csdn.net/qq_39839807/article/details/104112415