第5单元 选择合适的数据结构
列表、元组、集合和字典是Python中最常用的复合数据结构,它们都属于容器类的数据结构。
Python用数组的方式实现列表。列表的搜索时间是线性的,因此用列表来存储大量可搜索的数据是不切实际的。
元组是不可变的列表,创建后就无法再更改。元组的搜索时间也是线性的。
与列表和元组不同,集合不是序列:集合项不存在索引。集合最多只能存储一个项的副本,具有次线性O(log(N))的搜索时间。集合非常适合于成员查找和消除重复项(如果将包含重复项的列表转换为集合,则重复项将会消失):
myList = list(set(myList)) # 删除myList中的重复项
可以将列表数据转换为查询成员速度更快的集合数据。在下面的例子中,bigList是以十进制字符串表示的前1000万个整数的列表:
bigList = [str(i) for i in range(10000000)] "abc" in bigList # 耗时0.2秒 bigSet = set(bigList) "abc" in bigSet # 耗时15~30微秒——快了10 000倍!
字典构建了从键到值的映射。任何可哈希的数据类型(数字、布尔、字符串、元组)的对象都可以作为键,且同一字典中的不同键可以属于不同的数据类型。Python对字典值的数据类型也没有限制。字典具有次线性O(log(N))搜索时间,它非常适合用于键值的查找。
你可以通过(键, 值)这样的元组列表创建字典,也可以使用内置类构造函数enumerate(seq)创建字典,这样得到的字典,其键为各项在seq中的序列号:
seq = ["alpha", "bravo", "charlie", "delta"] dict(enumerate(seq)) ➾ {0: 'alpha', 1: 'bravo', 2: 'charlie', 3: 'delta'}
另一种从键序列(kseq)和值序列(vsec)创建字典变量的巧妙方法,是使用内置类构造函数zip(kseq, vseq)(两个序列必须具有相同的长度):
kseq = "abcd" # 字符串也是一个序列 vseq = ["alpha", "bravo", "charlie", "delta"] dict(zip(kseq, vseq)) ➾ {'a': 'alpha', 'c': 'charlie', 'b': 'bravo', 'd': 'delta'}
Python将enumerate(seq)和zip(kseq, vseq)(以及经典的range()函数)实现为列表生成器。列表生成器提供了一个迭代器接口,这使得我们可以在for循环中使用它们。与真正的列表不同的是,列表生成器只在需要时才生成下一个元素,这可以说是一种巧妙的偷懒方式。列表生成器便于处理大型列表,甚至允许“无限”的列表。你可以通过调用list()函数,将列表生成器显式强制转换为列表。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论