【问题标题】: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

标签: python json


【解决方案1】:

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

sorted(jsonpost.keys())

【讨论】:

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

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

【讨论】:

  • 是的,我需要按顺序拿到钥匙
【解决方案3】:

无论是 JavaScript 的 JSON 还是 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 或更高版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 2017-12-13
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        相关资源
        最近更新 更多