【问题标题】:How to prevent Python dictionary key ordering reversal?如何防止 Python 字典键顺序颠倒?
【发布时间】:2022-11-16 17:03:22
【问题描述】:

我有以下涉及字典的python代码sn-p,

    sample_dict = {
        "name": "Kelly",
        "age": 25,
        "salary": 8000,
        "city": "New york"
    }
    keys = ["name", "salary"]
    sample_dict = {k: sample_dict[k] for k in sample_dict.keys() - keys}
    print(sample_dict)

为什么输出是{'city': 'New york', 'age': 25}而不是{'age': 25, 'city': 'New york'}

是什么导致字典键的逆序?任何帮助将不胜感激。我在 Spyder 和 Python 3.8.5 版本上执行了代码。

【问题讨论】:

    标签: python dictionary key


    【解决方案1】:

    我猜在处理 keys() 和 keys 列表之间的 - 时顺序丢失了(因为它涉及到无序集合的转换)。您可以按照以下方式建立理解以防止它。

    keys = {"name", "salary"}
    sample_dict = {k: sample_dict[k] for k in sample_dict.keys() if k not in keys}
    

    【讨论】:

    • 是的,删除 - 符号确实可以防止更改顺序。但我实际上是在寻找真正导致订单更改的理由。
    • 看到你更新的答案,谢谢。
    • 另外为什么 - 键之间的符号将键转换为设置?
    【解决方案2】:

    虽然 dict 保留了 3.7 以来的插入顺序。

    在 3.7 版更改:字典顺序保证是插入顺序。此行为是 CPython 从 3.6 开始的一个实现细节。

    set 没有。

    作为无序集合,集合不记录元素位置或插入顺序。

    查看sample_dict.keys() - keys的结果,会发现是set

    remain_keys = sample_dict.keys() - keys
    print(type(remain_keys))
    # set
    for k in remain_keys:
        print(k)
    # city
    # age
    

    【讨论】:

    • 但这甚至不是按字母顺序排列的。 remain_keys 的顺序是如何决定的?
    • @aleph,我猜测它与hash函数、碰撞等有关。如果你遍历s1 = set(["age", "city"])s2 = set(["city", "age"]),你会得到不同的结果。我试图找到一个合理的解释,但我失败了。您可以为此打开一个新问题。 This 可能会给您一些见解。
    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 2021-06-10
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多