Python中的高级数据结构
admin
2023-07-31 00:48:14
0

数据结构

数据结构的概念很好理解,就是用来将数据组织在一起的结构。换句话说,数据结构是用来存储一系列关联数据的东西。在Python中有四种内建的数据结构,分别是List、Tuple、Dictionary以及Set。大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择,例如Collection、Array、Heapq、Bisect、Weakref、Copy以及Pprint。本文将介绍这些数据结构的用法,看看它们是如何帮助我们的应用程序的。

关于四种内建数据结构的使用方法很简单,并且网上有很多参考资料,因此本文将不会讨论它们。

1. Collections

collections模块包含了内建类型之外的一些有用的工具,例如Counter、defaultdict、OrderedDict、deque以及nametuple。其中Counter、deque以及defaultdict是最常用的类。

1.1 Counter()

如果你想统计一个单词在给定的序列中一共出现了多少次,诸如此类的操作就可以用到Counter。来看看如何统计一个list中出现的item次数:

12345 from collections import Counter li = ["Dog", "Cat", "Mouse", 42, "Dog", 42, "Cat", "Dog"]a = Counter(li)print a # Counter({'Dog': 3, 42: 2, 'Cat': 2, 'Mouse': 1})

若要统计一个list中不同单词的数目,可以这么用:

1234567 from collections import Counter li = ["Dog", "Cat", "Mouse", 42, "Dog", 42, "Cat", "Dog"]a = Counter(li)print a # Counter({'Dog': 3, 42: 2, 'Cat': 2, 'Mouse': 1}) print len(set(li)) # 4

如果需要对结果进行分组,可以这么做:

12345678910 from collections import Counter li = ["Dog", "Cat", "Mouse","Dog","Cat", "Dog"]a = Counter(li) print a # Counter({'Dog': 3, 'Cat': 2, 'Mouse': 1}) print "{0} : {1}".format(a.values(),a.keys())  # [1, 3, 2] : ['Mouse', 'Dog', 'Cat'] print(a.most_common(3)) # [('Dog', 3), ('Cat', 2), ('Mouse', 1)]

以下的代码片段找出一个字符串中出现频率最高的单词,并打印其出现次数。

123456789101112131415161718192021222324252627282930313233343536 import refrom collections import Counter string = """   Lorem ipsum dolor sit amet, consectetur    adipiscing elit. Nunc ut elit id mi ultricies    adipiscing. Nulla facilisi. Praesent pulvinar,    sapien vel feugiat vestibulum, nulla dui pretium orci,    non ultricies elit lacus quis ante. Lorem ipsum dolor    sit amet, consectetur adipiscing elit. Aliquam    pretium ullamcorper urna quis iaculis. Etiam ac massa    sed turpis tempor luctus. Curabitur sed nibh eu elit    mollis congue. Praesent ipsum diam, consectetur vitae    ornare a, aliquam a nunc. In id magna pellentesque    tellus posuere adipiscing. Sed non mi metus, at lacinia    augue. Sed magna nisi, ornare in mollis in, mollis    sed nunc. Etiam at justo in leo congue mollis.    Nullam in neque eget metus hendrerit scelerisque    eu non enim. Ut malesuada lacus eu nulla bibendum    id euismod urna sodales.  """ words = re.findall(r'\\w+', string) #This finds words in the document lower_words = [word.lower() for word in words] #lower all the words word_counts = Counter(lower_words) #counts the number each time a word appearsprint word_counts # Counter({'elit': 5, 'sed': 5, 'in': 5, 'adipiscing': 4, 'mollis': 4, 'eu': 3, # 'id': 3, 'nunc': 3, 'consectetur': 3, 'non': 3, 'ipsum': 3, 'nulla': 3, 'pretium':# 2, 'lacus': 2, 'ornare': 2, 'at': 2, 'praesent': 2, 'quis': 2, 'sit': 2, 'congue': 2, 'amet': 2, # 'etiam': 2, 'urna': 2, 'a': 2, 'magna': 2, 'lorem': 2, 'aliquam': 2, 'ut': 2, 'ultricies': 2, 'mi': 2, # 'dolor': 2, 'metus': 2, 'ac': 1, 'bibendum': 1, 'posuere': 1, 'enim': 1, 'ante': 1, 'sodales': 1, 'tellus': 1,# 'vitae': 1, 'dui': 1, 'diam': 1, 'pellentesque': 1, 'massa': 1, 'vel': 1, 'nullam': 1, 'feugiat': 1, 'luctus': 1, # 'pulvinar': 1, 'iaculis': 1, 'hendrerit': 1, 'orci': 1, 'turpis': 1, 'nibh': 1, 'scelerisque': 1, 'ullamcorper': 1,# 'eget': 1, 'neque': 1, 'euismod': 1, 'curabitur': 1, 'leo': 1, 'sapien': 1, 'facilisi': 1, 'vestibulum': 1, 'nisi': 1, # 'justo': 1, 'augue': 1, 'tempor': 1, 'lacinia': 1, 'malesuada': 1})

1.2 Deque

Deque是一种由队列结构扩展而来的双端队列(double-ended queue),队列元素能够在队列两端添加或删除。因此它还被称为头尾连接列表(head-tail linked list),尽管叫这个名字的还有另一个特殊的数据结构实现。

Deque支持线程安全的,经过优化的append和pop操作,在队列两端的相关操作都能够达到近乎O(1)的时间复杂度。虽然list也支持类似的操作,但是它是对定长列表的操作表现很不错,而当遇到pop(0)和insert(0, v)这样既改变了列表的长度又改变其元素位置的操作时,其复杂度就变为O(n)了。

来看看相关的比较结果:

123456789101112131415161718192021222324252627282930313233343536373839404142434445 import timefrom collections import deque num = 100000 def append(c):    for i in range(num):        c.append(i) def appendleft(c):    if isinstance(c, deque):        for i in range(num):            c.appendleft(i)    else:        for i in range(num):            c.insert(0, i)def pop(c):    for i in range(num):        c.pop() def popleft(c):    if isinstance(c, deque):        for i in range(num):            c.popleft()    else:        for i in range(num):            c.pop(0) for container in [deque, list]:    for operation in [append, appendleft, pop, popleft]:        c = container(range(num))        start = time.time()        operation(c)        elapsed = time.time()

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...