Python有序字典的两个小“惊喜”~~
source link: https://mp.weixin.qq.com/s?__biz=MzUyOTk2MTcwNg%3D%3D&%3Bmid=2247487399&%3Bidx=1&%3Bsn=63a22da5ca1fd1b9857ba825436bfb5e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
△点击上方 “ Python猫 ”关注 ,回复“ 1 ”领取电子书
花下猫语:今天是“1024程序员节”,不知道读者们都是怎么安排日程的?反正我是终于有时间写新的文章了,所以宅家创作ing……
英文: Ordered dict surprises
( https://nedbatchelder.com//blog/202010/ordered_dict_surprises.html )
作者:Ned Batchelder
译者:豌豆花下猫
来源:Python猫
从 Python 3.6 开始,常规的字典会记住其插入的顺序:就是说,当遍历字典时,你获得字典中元素的顺序跟它们插入时的顺序相同。
在 3.6 之前,字典是无序的:遍历顺序是随机的。
关于有序字典,这里有两件令人意外的事情。
1、你无法获得第一个元素
由于字典中的元素具有特定的顺序,因此获取第一个(或第 N 个)元素应该很容易,对吧?
不对!没办法直接做到。
你可能会认为 d[0] 就是第一个元素,但并不是,它只是键为 0 的值,有可能是添加到字典的最后一个元素。
获得第 N 个元素的唯一方法是遍历字典,直到取得第 N 个元素。不能根据有序索引来作随机访问。
这是一处列表胜过字典的地方。获取列表的第 N 个元素是 O(1) 操作。获取字典的第 N 个元素(即使已排序)是 O(N) 操作。
2、OrderedDict 有点不同
由于现在的字典是有序的,collections.OrderedDict 就没用了,对吧?
(译注:3.6 版本前的 dict 是无序的,但标准库里提供了一个有序字典 OrderedDict。现在 dict 变有序了,那 OrderedDict 似乎是多余了?)
好像是。但是它不会被删除,因为那样会破坏正在使用它的代码,并且它还拥有一些常规字典没有的方法。
另外,它们在行为上也有细微的差别。在比较是否相等时,常规字典不会考虑顺序,但 OrderedDict 会:
>>> d1 = {"a": 1, "b": 2} >>> d2 = {"b": 2, "a": 1} >>> d1 == d2 True >>> list(d1) ['a', 'b'] >>> list(d2) ['b', 'a'] >>> from collections import OrderedDict >>> od1 = OrderedDict([("a", 1), ("b", 2)]) >>> od2 = OrderedDict([("b", 2), ("a", 1)]) >>> od1 == od2 False >>> list(od1) ['a', 'b'] >>> list(od2) ['b', 'a'] >>>
(译文完)
文章太短不够看? Python猫
曾转载过一篇《 OrderedDict是如何保证Key的插入顺序的? 》,有比较深入的技术原理剖析,推荐大家作关联阅读。
Python猫技术交流群开放啦! 群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请在公号内回复『 交流群 』,获取猫哥的微信 (谢绝广告党,非诚勿扰!) ~
Recommend
-
47
1、
-
31
题目来源: 力扣(LeetCode) 题目详情: 给你两个有序整数数组 nums1 和 nums2,请你将 nums...
-
6
LeetCode 图解 | 21.合并两个有序链表-五分钟学算法 当前位置:五分钟学算法 > LeetCodeAnimation > LeetCode 图解 | 21.合并两个有序链表
-
7
LeetCode 第 21 号问题:合并两个有序链表-程序员小吴 当前位置:程序员小吴 > LeetCodeAnimation > LeetCode 第 21 号问题:合并两个有序链表...
-
9
Leetcode 88 合并两个有序数组发布于 今天 15:13 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1...
-
3
Leetcode 21 合并两个有序链表发布于 8 分钟前将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
-
5
Leetcode 021 合并两个有序链表 ( Merge Two Sorted Lists ) 题解分析 Posted on 2021-10-07 In Java , leetcode Views: 5...
-
5
leetcode 4. 寻找两个有序数组的中位数 发表于...
-
5
[ 链表OJ题--C语言 ] 合并两个有序链表 原创 小白又菜 2022-05-08 19:26:30...
-
7
[leetcode]合并两个有序数组 Posted on
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK