字典、json(转储、加载)和defaultdict是否保留了python 3.7中的顺序?
我一直认为字典是无序的,这意味着我们必须使用OrderedDict之类的工具来让它记住插入顺序 当我看到python文档时,有人提到,从python3.7开始,dict是有序的 我对这一点没有什么怀疑字典、json(转储、加载)和defaultdict是否保留了python 3.7中的顺序?,python,python-3.x,Python,Python 3.x,我一直认为字典是无序的,这意味着我们必须使用OrderedDict之类的工具来让它记住插入顺序 当我看到python文档时,有人提到,从python3.7开始,dict是有序的 我对这一点没有什么怀疑 如果dict保留插入顺序,这是否意味着即使集合中的defaultdict也会这样做 如果我有如下数据,那么使用defaultdict数据的json.dumps和json.loads功能如何 编辑:(json) (文件) 在Python3.7之前,dict不能保证是有序的,因此输入 并且输出通常被置
defaultdict
也会这样做- 向后兼容性(如果需要支持较旧的python版本)
- 使用和对键重新排序
- 更清晰的意图:如果您依赖于您的dict密钥被订购,OrderedDict会使其变得明显,但您确实会损失一些性能
- 比较OrderedDicts时会考虑键的顺序,而dicts则忽略键的顺序(感谢@ShadowRanger的通知):
from collections import OrderedDict
one_dict = {"a": 1, "b": 2}
another_dict = {"b": 2, "a": 1}
one_ordered_dict = OrderedDict(a=1, b=2)
another_ordered_dict = OrderedDict(b=2, a=1)
print(one_dict == another_dict)
# True
print(one_ordered_dict == another_ordered_dict)
# False
如果需要这些要求中的任何一个,OrderedDict可以帮助您,否则您可以使用常规dict
Json转储/加载
关于json.dump
,这是一个不同的问题:
据我所知,迭代
过了一段时间,所以不应该改变顺序
如果需要,可以强制进行词典排序:
>>> json.dumps({'b': 1, 'a': 2}, sort_keys=True)
'{"a": 2, "b": 1}'
关于加载,我不明白为什么不能保留顺序,但我承认我在和的源代码中迷失了方向
如果需要,您可以使用:
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
嵌套字典
上述情况也适用于嵌套的dict:\u iterencode\u dict
被调用,并且键用于所有dict
事实上:
>>> json.dumps({'b': 1, 'a': {'d': 1, 'c': 3}}, sort_keys=True)
'{"a": {"c": 3, "d": 1}, "b": 1}'
干杯 试一试不是更容易吗?试一试时发生了什么?文档中说“defaultdict是内置dict类的一个子类。它重写一个方法并添加一个可写实例变量。其余功能与dict类相同,此处不作说明。”defaultdict和JSON是两个完全不同的问题——它们分为两个问题。JSON格式不支持在对象
JSON中排序。转储sort\u键只有在我们有dict时才起作用,不是吗?在我的情况下,我有嵌套的dict,所以这不会正常工作?因为sort_键只对外部键进行排序。如果您看到我上面提供的示例数据,那就是我提供的数据类型have@user_12不,它会对所有JSON对象的键进行排序。我添加了一个关于嵌套dict的部分,它会递归地对键进行排序。@juanpa.arrivillaga得到了它,然后我可以在使用dump或load时安全地使用sort_键。这是有益的。OrderedDict
比普通的dict
:与另一个OrderedDict
相比,OrderedDict
的相等性测试是顺序敏感的dict
不是(dict==dict
或dict==ORDERDEDDICT
或ORDERDEDDICT==dict
不区分顺序,但ORDERDEDDICT==ORDERDEDDICT
是顺序敏感的;如果键顺序不匹配,则不相等)。
>>> json.dumps({'b': 1, 'a': {'d': 1, 'c': 3}}, sort_keys=True)
'{"a": {"c": 3, "d": 1}, "b": 1}'