为啥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】:无论是 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 或更高版本。
【讨论】:
以上是关于为啥json.keys()以不同的顺序获取密钥[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如果 I/O 完成端口数据包可能以不同的顺序出列,为啥 I/O 完成端口数据包会按 FIFO 顺序排队?
为啥 Rust 函数和 FFI C++ 函数以相反的顺序执行?