字典、json(转储、加载)和defaultdict是否保留了python 3.7中的顺序?

字典、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不能保证是有序的,因此输入 并且输出通常被置

我一直认为字典是无序的,这意味着我们必须使用OrderedDict之类的工具来让它记住插入顺序

当我看到python文档时,有人提到,从python3.7开始,dict是有序的

我对这一点没有什么怀疑

  • 如果dict保留插入顺序,这是否意味着即使集合中的
    defaultdict
    也会这样做
  • 如果我有如下数据,那么使用defaultdict数据的json.dumps和json.loads功能如何
  • 编辑:(json) (文件)

    在Python3.7之前,dict不能保证是有序的,因此输入 并且输出通常被置乱,除非collections.OrderedDict 这是特别要求的。从Python3.7开始,常规的dict 变得有序,因此不再需要指定 collections.OrderedDict用于JSON生成和解析

    至于第二个疑问,我在python中找到了上面的语句 json文档,但我想知道这是否适用于 嵌套的defaultdict数据

    我尝试过这些方法,它是为了保持秩序,但我想确保不管怎样,它都能保持秩序。

    Python dicts 由于python 3.7将dict的实现作为实现的一部分进行排序,而不是作为实现的副作用,因此可以可靠地使用dict。OrderedDict仍然很有用,原因如下:

    • 向后兼容性(如果需要支持较旧的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}'