

pythonでは2つの辞書を比較するのに `==` を使っても大丈夫でしょうか？  
全てのkey, valueのペアが一致しているかどうかを調べたいです。

[code]

    dict1 = {'a': 1, 'b':2, 'c': 3}
    dict2 = {'a': 1, 'c': 3, 'b':2}
    print(dict1 == dict2)
    
    dict3 = {'a': 1, 'b':2, 'c': 3}
    dict4 = {'a': 1, 'c': 3, 'b':2.0}
    print(dict3 == dict4)
    
[/code]

printではどちらも `True` が返ってきました。  
辞書でkeyの順序は関係ないのは分かります。  
`2 == 2.0`が`True`で判定されるもの問題ないです。

例ではkeyを文字列、valueを数値にしていますが、valueがリストだったり辞書だったりした場合でも問題ないでしょうか？

[code]

    import pickle
    x = pickle.dumps(dict1)
    y = pickle.dumps(dict2)
    print(x == y)
    
    p = pickle.dumps(dict3)
    q = pickle.dumps(dict4)
    print(p == q)
    
[/code]

ちなみに`pickle.dumps()`でシリアライズをすると`x==y`は`True`になりましたが、`p==q`は`False`になりました。


CC BY-SA 3.0
2017-03-07T07:37:53.627
33162
2017-03-10T13:42:24.460
2017-03-10T13:42:24.460
3054
question
python
Pythonで辞書同士を比較し同値性を確認したい


> valueがリストだったり辞書だったりした場合でも問題ないでしょうか？

リスト／辞書に対して再帰的に比較が行われるため、期待通りの振る舞いとなります。

Python(3.6) The Python Language Reference [6.10.1. Value
comparisons](https://docs.python.org/3.6/reference/expressions.html#value-
comparisons)より引用：

> The following list describes the comparison behavior of the most important
> built-in types.
>
>   * [...]
>   * Sequences (instances of `tuple`, `list`, or `range`) can be compared
> only within each of their types, with the restriction that ranges do not
> support order comparison. Equality comparison across these types results in
> inequality, and ordering comparison across these types raises `TypeError`.
>   * [...]
>   * Mappings (instances of `dict`) compare equal if and only if they have
> equal _(key, value)_ pairs. Equality comparison of the keys and elements
> enforces reflexivity.
>

* * *

> `pickle.dumps()`でシリアライズをすると`x==y`は`True`になりましたが、`p==q`は`False`になりました。

シリアライズ結果をみれば自明かと思いますが、`2`と`2.0`部分が異なるバイト列に変換されています。`p`,
`q`は異なるバイト列のため同値ではありません（`p==q`の結果は`False`）。

また`x==y`が`True`になったのは **偶然** です。他のPython処理系では異なる結果になる可能性があります。手元で試したところCPython
3.6と3.5では結果が異なりました。これは[CPython
3.6で辞書型(`dict`)が順序を保持するように実装変更された](https://mail.python.org/pipermail/python-
dev/2016-September/146348.html)ためと推測されますが、Python言語としては依然として「辞書型の順序保証はしない」ことになっています。


CC BY-SA 3.0
2017-03-09T04:09:38.167
33203
2017-03-09T04:16:30.010
2017-03-09T04:16:30.010
49
49
33162
answer