【问题标题】:What determines the ordering of dictionaries in Python 3.6什么决定了 Python 3.6 中字典的顺序
【发布时间】:2020-10-08 00:41:50
【问题描述】:

我正在使用数据框字典对 NFL 球队进行一些分析。我需要遍历字典(向后,按插入时间排序)以进行我计划进行的分析。每个 NFL 球队都有自己的字典。

我的函数使用类似于顶部显示的行的代码遍历字典。每个键都是一个元组,元组中的第二个条目表示比赛进行的(NFL 赛季)周。我最初插入第 1 周的键和值,然后插入第 2 周的键和值,然后插入第 3 周的键和值。看到输出,这按计划工作,这意味着我的功能应该按预期工作。实践中没有问题。但是,如果您查看字典本身,则键是乱序的(请参阅第二个输出)。

那么当你查看字典时,究竟是什么决定了键的顺序呢? Buccaneers 的字典是 2 -> 1 -> 3。但每个球队的字典都不是这样。顺序似乎完全随机。是什么决定了这个顺序?我很好奇(我肯定将它们按 1 -> 2 -> 3 的顺序插入每个团队)。我正在使用 Python 3.6

【问题讨论】:

  • 这听起来像是您使用过时的 IPython 内核,它在显示 dicts 时对键进行排序。更新你的 IPython。

标签: python dictionary python-3.6


【解决方案1】:

详情请参阅this question。总而言之,字典从 CPython 3.6 开始按插入顺序排序,但这是 Python 3.7 规范之前的实现细节。 doc 声明:

3.7 版更改:保证字典顺序为插入顺序。

因此您的问题的答案是:

  • 如果您的意思是 CPython,那么字典顺序就是 插入顺序(尽管规范不保证这一点,理论上可以想象一个补丁CPython 3.6 打破了这种行为)
  • 如果您指的是任何实现(CPython、Jython、PyPy...),则该实现确定字典顺序:不保证顺序(除非实现指定)。

您可能会问,为什么有些字典的实现不是按插入顺序排列的。我建议你检查hash table data structure。基本上,这些值被放入一个数组中,具体取决于键的哈希值。哈希是一个将键映射到数组单元格索引的函数。这就是查找速度如此之快的原因:获取键,计算哈希,读取单元格中的值(我忽略了冲突解决细节),而不是扫描整个(键,值)对列表。

不保证散列键的顺序与键的插入顺序(或键本身的顺序)相同。如果通过扫描数组来列出键,键的顺序看起来是随机的。


备注:您可以使用OrderDict 类强制对键进行排序,但这是键的顺序(例如'Opponent' < 'Reference')。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2012-02-17
    • 2021-07-19
    相关资源
    最近更新 更多