返回介绍

第5单元 选择合适的数据结构

发布于 2024-01-28 22:01:16 字数 1447 浏览 0 评论 0 收藏 0

列表、元组、集合和字典是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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文