2017-10-18 108 views
2

我希望將JSON響應的輸出與我定義的字典進行比較。字典和JSON對象沒有排序。Python:在比較它們之前我需要對Dictionary進行排序嗎?

從我自己的測試,與此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))保證比較之前的順序?

回答

2

據我所知,你不需要你的字典的鍵排序,如比較舊python documentation提到:

映射(字典)比較相等當且僅當它們的排序 ( (5.4)除了等號 之外的結果一致解決,但沒有另外定義。 (5.5)

...相等。 (5.4)

該實現可以高效地計算這個值,而無需構建列表或排序。

...定義。 (5.5)

早期版本的Python使用排序(鍵值)列表的字典對比,但這對於常見的比較相等的情況非常昂貴。甚至更早的Python 僅通過身份對字典進行了比較,但是這導致了意外 ,因爲人們希望能夠通過將字典與{}進行比較來測試字典中的虛擬空間 。

此外,它有助於知道在python中,詞典是使用散列表和非平衡樹實現的。

1

從手冊:python比較字典通過比較他們排序的鍵值對。 在我看來,這意味着即使沒有對鍵進行排序,它們也會按排序順序進行比較,這似乎是比較2個字典的唯一合理方法。 所以我相信你不需要use sort_keys=True但不知何故,這可能是一個優化。

1

Python字典是無序的,並且如果兩個字典具有相同的鍵:值對(無論順序),句號,它們會相等。所以你不需要排序任何東西來比較你自己的dict和從json解析出來的dict。

相關問題