从 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']

>>>

(译文完):(https://nedbatchelder.com//blog/202010/ordered_dict_surprises.html)

【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0

python 字典添加元素乱序了_Python有序字典的两个小“惊喜”相关推荐

  1. python字典是无序的吗_Python 有序字典 OrderedDict 和无序字典 Dict

    Python 默认的字典是无序的,如果我们需要让他变成有序,很简单,使用有序字典即可,会按照添加顺序自动排序,先添加的在前面,后添加的在后面.Python 中有一个 OrderedDict,刚好就是实 ...

  2. python dataframe 合并乱序列表_Python数据处理--删除重复项、数值替换和表合并

    导入需要的包:numpy.pandas import numpy as py import pandas as pd 创建一个表: df = pd.DataFrame({"id": ...

  3. python升序和降序排序_python中序列的排序,包括字典排序、列表排序、升序、降序、逆序...

    一.基础概念 我们知道python中的内建序列包括字典.列表.元组.字符串等,序列是python中最基本的数据结构. 列表.元组.字符串这类的序列的索引默认第一个元素的索引从0开始,第二个元素的索引是 ...

  4. 解决python读取文件乱序的问题

    在使用python批量读取文件,会存在文件乱序的情况,因为只有数字进行排序,当文件名中出现字母或者下划线时,读取的顺序就会被打乱,这时需要自己排好文件顺序. if __name__ == '__mai ...

  5. python 获取 字典中的指定键_python中字典方法的详细教程

    上篇文章讲到了python字典的基础知识,今天继续python中哈希(字典的应用)方法的应用. 前章回顾: python字典的应用及案例分析 字典方法: dict.clear() 删出字典内所有的元素 ...

  6. python映射类型是什么意思_Python中字典映射类型的学习教程

    字典是python语言中唯一的映射类型,用花括号{}表示,一个字典条目就是一个键值对,方法keys()返回字典的键列表,values()返回字典的值列表,items()返回字典的键值对列表.字典中的值 ...

  7. python字典按value逆序排序_python 对字典按照value进行排序的方法

    字典按照value进行排序共有三种方法 d = {'a': 1, 'b': 4, 'c': 2, 'f' : 12} # 第一种方法,key使用lambda匿名函数取value进行排序 a = sor ...

  8. python中字典和集合的区别_Python中字典和集合学习小结

    映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元组等 包含可变对象的列表. ...

  9. python中列表字典元组之间的区别_python之字典、元组、列表的区别

    1.列表:专门用于存储一串信息,列表用中括号[]定义,数据之间使用逗号,分隔 list_0=['a','b','c'] 列表的特点: 1)可修改.可增加.可删除 2)列表是有序的,可以遍历 3)可以将 ...

最新文章

  1. 【特征】机器学习之特征优选
  2. 使用 .NET 升级助手将.NET Framework应用迁移到.NET 5
  3. 解决html2canvas截取页面部分div黑屏问题
  4. amp mysql升级_【简单的案例分享,停机10分钟】10204升级CRSamp;amp;DB的PSU至1
  5. 一文轻松搞懂-条件随机场CRF
  6. 使用 Blueprint 要注意 render_template 函数
  7. DirectSound---输出设备基本操作(枚举、查询等)
  8. php网页象棋源码,JS小游戏之象棋暗棋源码详解_javascript技巧
  9. 微信名片、公众号二维码美化生成器!
  10. 微信联盟链接不到服务器怎么,LOL微信登不上去怎么办?微信登不上解决方法推荐...
  11. 无人驾驶感知篇之传感器标定(二)
  12. 偷偷告诉你中国小姐姐的真实Size!!
  13. 如何设置等高线坐标系并输出
  14. request.getParameter()等类似概念理解
  15. ubuntu 安装依赖包时出现The following packages have unmet dependencies:
  16. linux环境怎么更新离线rpm包,SUSE Linux 11系统rpm包离线安装GCC
  17. windows服务器dmp文件分析,如何用WinDbg分析MEMORY.DMP文件
  18. python动态横道图_用Python pyecharts v1.x 绘制图形【转】
  19. 深入理解MVC和jstl
  20. 【社会工程学】Social Engineering Toolkit工具实践与简要说明

热门文章

  1. OpenCV中的函数子
  2. Django环境配置
  3. Android下拉刷新效果实现
  4. 自定义viewgroup实现ArcMenu
  5. Change Unidirectional Association to Bidirectional(将单向关联改为双向关联)
  6. java 线程 api_Java核心API之线程(上)
  7. 工具用途_见微知著,小工具大用途!
  8. [设计模式] ------ 工厂方法模式
  9. AI应用开发实战系列之四 - 定制化视觉服务的使用
  10. php实现把es6转为es5,使用webpack将ES6转化ES5的实现方法