Python:在比较之前我需要对Dictionary进行排序吗?

时间:2017-10-18 11:41:58

标签: python sorting dictionary data-structures

我希望将JSON响应的输出与我定义的字典进行比较。字典和JSON对象未订购。

从我自己的测试中,将此JSON响应存储为res.data

{
    "message": "Staff name and password pair not match",
    "errors": {
        "resource": "Login",
        "field": "staff_authentication",
        "code": "invalid",
        "stack_trace": null
    }
}

我找不到anything that refers to Dictionary comparison operator in Python documentation。我已经阅读了有关从JSON字符串加载的排序字典的文章,但是根据我自己的测试,比较运算符可以正常工作而无需排序。 与这个不同排序的词典相比,将产生True

invalid_password_json = dict(
                                    errors=dict(
                                        resource="Login",
                                        code="invalid",
                                        field="staff_authentication",
                                        stack_trace=None,),
                                        message="Staff name and password pair not match",
                                    )
        assert json.loads(res.data, object_pairs_hook=OrderedDict) == invalid_password_json

我需要使用json.dumps(my_password, sort_keys=True)json.loads(res.data, object_pairs_hook=OrderedDict))来确保比较前的订单吗?

3 个答案:

答案 0 :(得分:2)

据我所知,您不需要对字典中的键进行排序,正如相当古老的python documentation所述:

  

映射(字典)比较相等,当且仅当它们已排序   (键,值)列表比较相等。(5.4)除了相等之外的结果   一致地解决,但没有另外定义。 (5.5)

     

......平等。 (5.4)

     

实现有效地计算它,而不构造列表或排序。

     

...定义。 (5.5)

     

早期版本的Python使用排序(键,值)列表的字典比较,但这对于常见的非常昂贵   比较平等的情况。一个更早版本的Python   仅通过身份比较字典,但这引起了惊喜   因为人们期望能够测试字典的空虚   将其与{}进行比较。

另外,知道在python中,字典是使用哈希表而不是平衡树实现的。

答案 1 :(得分:1)

从手册中:python通过比较它们的排序键值对来比较字典。 在我看来,这意味着即使密钥没有排序,它们也会按排序顺序进行比较,这似乎是比较2个字典的唯一合理方法。 所以我相信你不需要use sort_keys=True,但不知怎的,这可能是一种优化。

答案 2 :(得分:1)

Python dicts是无序的,如果它们具有相同的键,则两个dicts比较相等:值对(无论顺序如何),句点。所以你不需要对你自己的dict和json解析的dict进行排序。