奇怪的Python:为何 list 和 dict 的元素顺序从 Python 3.7 开始保持插入顺序?

你好!我是老邓,你的 Python 导师。今天我们来聊聊 Python 3.7 后 list 和 dict 元素顺序保持插入顺序的特性。

1、问题简介

在 Python 3.7 之前,list 的元素顺序虽然通常与插入顺序一致,但官方文档并没有做出保证。dict 的元素顺序则完全是随机的。

从 Python 3.7 开始,官方正式将"维护插入顺序"作为 list 和 dict 的一个语言特性。这意味着,元素的迭代顺序将始终与其插入顺序相同。

2、想象一下,你正在处理用户提交的调查问卷。问卷中有多个问题,每个问题的答案都存储在一个 list 中。

在 Python 3.6 中,你无法保证处理答案的顺序与用户填写顺序一致,这可能导致数据分析出现偏差。

又例如,你需要记录用户访问网站的页面顺序,使用 dict 存储页面和访问时间。在 Python 3.6 中,dict 的无序性使得你无法直接获取用户访问的页面顺序。

3、原因和解决方案

Python 3.7 中的这一改变源于对 dict 内部实现的优化。新的实现使用了一种更紧凑的哈希表结构,并保留了插入顺序。

这不仅提高了 dict 的性能,也带来了维护插入顺序的特性。对于 list 来说,维持插入顺序一直是其实现的一部分,只是在 3.7 版本才正式写入规范。

如果你需要在 Python 3.6 或更早版本中维护 list 或 dict 的插入顺序,可以使用 collections 模块中的 OrderedDict (对于 dict) 和 list 自身 (对于 list,虽然未保证但通常保持顺序,必要时可以自行记录插入顺序)。

4、代码示例

示例 1: Python 3.6 中的 dict

复制代码
# Python 3.6
my_dict = {}
my_dict["apple"] = 1
my_dict["banana"] = 2
my_dict["orange"] = 3

for key, value in my_dict.items():
    print(f"{key}: {value}")

输出结果(Python 3.6版本下,每次运行结果可能不同):

复制代码
orange: 3
apple: 1
banana: 2

示例 2: Python 3.7+ 中的 dict

复制代码
# Python 3.7+
my_dict = {}
my_dict["apple"] = 1
my_dict["banana"] = 2
my_dict["orange"] = 3

for key, value in my_dict.items():
    print(f"{key}: {value}")

输出结果:

复制代码
apple: 1
banana: 2
orange: 3

示例 3: Python 3.6 中使用 OrderedDict

复制代码
# Python 3.6
from collections import OrderedDict

ordered_dict = OrderedDict()
ordered_dict["apple"] = 1
ordered_dict["banana"] = 2
ordered_dict["orange"] = 3

for key, value in ordered_dict.items():
    print(f"{key}: {value}")

输出结果:

apple: 1
banana: 2
orange: 3

示例 4: list 的顺序保持

复制代码
# Python 3.7+ (3.6也通常如此,但非规范)
my_list = []
my_list.append("apple")
my_list.append("banana")
my_list.append("orange")

for item in my_list:
    print(item)

输出结果:

复制代码
apple
banana
orange

5、总结

Python 3.7 及以后版本保证了 list 和 dict 的插入顺序。这使得代码更加可预测,也简化了对顺序敏感的操作。如果你需要在早期版本中实现类似的功能,可以使用 collections.OrderedDict。

记住,理解语言的特性对于编写高效、可靠的代码至关重要。希望今天的讲解能够帮助你更好地理解 Python 中的这个重要特性。

全套Python学习资料分享:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

三、python入门资料大全

四、python进阶资料大全

五、python爬虫专栏

六、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

七、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

八、python最新面试题

相关推荐
汀沿河6 分钟前
基于Swarm的大模型应用:一个天气助手
开发语言·人工智能·python
PyAIGCMaster1 小时前
pycharm 命令行下的链接,不自动形成链接和定位了。
ide·python·pycharm
.远_1 小时前
CUDA C | 第一章 基于CUDA的异构并行计算
linux·c++·人工智能·python
学地理的小胖砸1 小时前
【python如何使用随机模块】
开发语言·python
小汤猿人类2 小时前
Spring AMQP ----消息转换器
服务器·python·spring
白雪公主的后妈2 小时前
Python爬虫基础——案例:爬取豆瓣电影动画排行榜
爬虫·python·requests模块·json模块
游客5202 小时前
图像处理 | 图像二值化
图像处理·人工智能·python·opencv·计算机视觉
weixin_470729982 小时前
匹配一个文件夹下的所有excel——python
开发语言·python·excel
大G哥3 小时前
Python实现应用决策树的实例程序
开发语言·python·算法·决策树·机器学习
铮铭3 小时前
DINOv2+Qwen2.5-VL-2B+LoRA实现image caption的微调
python·深度学习·机器学习·具身智能·vla