gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:42:10 25 4
gpt4 key购买 nike

我一直认为字典是无序的,这意味着我们必须使用像 OrderedDict 这样的东西来让它记住插入顺序。
当我看到 python 文档时,有人提到从 python 3.7 dict 是订购的。
我对此几乎没有怀疑,

  • 如果 dict 保留插入顺序是否意味着即使是 defaultdict在收藏中也会这样做吗?
  • json.dumps 和 json.loads 功能如何使用 defaultdict 数据,如果我有如下数据,

  • EDIT: https://docs.python.org/3/library/json.html (jsondocumentation)

    Prior to Python 3.7, dict was not guaranteed to be ordered, so inputsand outputs were typically scrambled unless collections.OrderedDictwas specifically requested. Starting with Python 3.7, the regular dictbecame order preserving, so it is no longer necessary to specifycollections.OrderedDict for JSON generation and parsing.


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

    from collections import defaultdict
    data = defaultdict(dict)

    data["0"]["a"] = "Google"
    data["0"]["b"] = "Google"
    data["0"]["c"] = "Google"
    data["1"]["a"] = "Google"
    data["1"]["b"] = "Google"
    data["1"]["c"] = "Google"
    data["2"]["a"] = "Google"
    data["2"]["b"] = "Google"
    data["2"]["c"] = "Google"
    data["3"]["c"] = "Google"
    data["3"]["b"] = "Google"
    data["3"]["a"] = "Google"

    json.dumps(data) # will these operations preserve the order
    json.loads(data)

    我已经尝试过这些并且它是保持秩序的,但我想确保无论如何这都将始终保持秩序。

    最佳答案

    Python 字典
    从 python 3.7 开始, dict 的实现作为 the 的一部分被排序specification ,不会作为实现的副作用,因此可以可靠地使用。 OrderedDict 仍然有用有几个原因:

  • 向后兼容性(如果您需要支持较旧的 Python 版本)
  • 使用 move_to_end 重新排序键和 pop_item
  • 更清晰的意图:如果你依赖你的 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 ,这是一个不同的问题:
    据我所知, JSONEncoder 迭代
    keys ,所以它不应该改变顺序。
    如果需要,您可以强制按字典顺序排列:
    >>> json.dumps({'b': 1, 'a': 2}, sort_keys=True)
    '{"a": 2, "b": 1}'
    关于加载,我不明白为什么不保留顺序,但我承认我在 decoder 的源代码中迷失了方向。和 scanner .
    如果你愿意,你可以使用:
    >>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
    OrderedDict([('b', 2), ('a', 1)])
    嵌套字典
    以上也适用于嵌套字典: _iterencode_dict被称为 recursively , 键是 sorted对于所有字典。
    的确:
    >>> json.dumps({'b': 1, 'a': {'d': 1, 'c': 3}}, sort_keys=True)
    '{"a": {"c": 3, "d": 1}, "b": 1}'
    干杯!

    关于python - 字典、json(转储、加载)、defaultdict 是否保留了 python 3.7 的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66878971/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com