为啥json.keys()以不同的顺序获取密钥[重复]

Posted

技术标签:

【中文标题】为啥json.keys()以不同的顺序获取密钥[重复]【英文标题】:Why json.keys() get keys in different order [duplicate]为什么json.keys()以不同的顺序获取密钥[重复] 【发布时间】:2013-08-01 05:25:35 【问题描述】:

您好,我在 python 中有以下代码:

import json
jsonpost = json.loads('"Player": "_id": "3","firstName":"kim","surname":"jones","newTable": "_id": "4","SurName": "abcd"')

for key in jsonpost.keys():
    for innerkey in jsonpost[key]:
        print innerkey

我的问题是为什么当我打印出内部键时,jsonpost['Player'] 的键顺序如下:

_id , surname, firstName

【问题讨论】:

字典不是在 Python 中排序的。 映射没有指定的顺序,只是键值的关联。您需要它们按特定顺序排列吗? 字典通常没有保证顺序。这是一个实现细节,因为它们不是为了迭代而构建的。我认为 Python 有一个名为“odict”的包用于此目的。 按照规范,JSON(无序的键/值对集)也是如此:json.org 【参考方案1】:

字典中的键的顺序永远不会相同,如果您希望它们在代码中始终保持相同的顺序,您可以这样做

sorted(jsonpost.keys())

【讨论】:

从来没有?还是在脚本执行的整个生命周期内始终如一?【参考方案2】:

Python 字典在内部使用哈希表实现。这意味着不保留密钥顺序。这是个问题吗?

【讨论】:

是的,我需要按顺序拿到钥匙【参考方案3】:

无论是 javascriptJSON 还是 Python 的 dict 都有排序的概念。你可以在 Python 中使用 collections.OrderedDict 来摆脱它,但 JavaScript 没有这样的替代方案。

【讨论】:

【参考方案4】:

Python 字典本质上是无序的,因此当您将它们打印出来时,键可能是无序的。

如果顺序很重要,您可以使用OrderedDict

import collections
jsonpost = collections.OrderedDict(sorted(jsonpost.items()))

或者你可以将for循环改为:

for key in sorted(jsonpost.keys()):
    for innerkey in jsonpost[key]:
        print innerkey

【讨论】:

【参考方案5】:

字典排序被指定为未指定,你可以sort(whatever.keys()) 或者你可以使用和排序字典,即collections.OrderedDict,如果你运行的是 python 2.7 或更高版本。

【讨论】:

以上是关于为啥json.keys()以不同的顺序获取密钥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥以不同的顺序运行我的测试会导致性能截然不同? [复制]

为啥我新签名的 apk 中的指纹不同?

如果 I/O 完成端口数据包可能以不同的顺序出列,为啥 I/O 完成端口数据包会按 FIFO 顺序排队?

为啥 Rust 函数和 FFI C++ 函数以相反的顺序执行?

如何在firebase中的onvalue侦听器上获取orderbykey格式的按键

为啥相同的 HSM 密钥每次都验证到不同的以太坊地址?