32

私はそのような2つの辞書を合計しようとします:

my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())

しかし、エラーを受け取ります

TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'

私は何を間違えますか?

4

3 に答える 3

52

Python 3.9(特にPEP 584)の時点で、dictsは、セットと同じように和集合(|)および更新(|=)演算を取得するため、これが、探しているものを実現するための「1つの真の方法」になります。

d1 | d2

そのPEPには、以前のPythonバージョンで使用可能な他のオプションがリストされていますが、これらにはすべて欠点があります。PEP 448(Python 3.5)を使用している場合は、次を使用することをお勧めします。

{**d1, **d2}

これにより、両方の辞書が新しい辞書に解凍され、結果として結合されます。

1つの問題は、必要な動作があいまいであるということです。辞書に重複するキーを含めることはできないため、両方に同じキーが含まれている場合に何をしたいかが明確ではありません。仕様は、このメソッドを使用したときに何が起こるかについて明示しています。

辞書では、後の値は常に前の値を上書きします

逆の動作が必要な場合は、リテラル内の辞書の順序を入れ替えるだけです。

辞書ビューはセットのように設定されているため、このアプローチは機能しません。そのため、追加が実装されていません。

おそらく必要なのはユニオン:ですd1.items() | d2.items()。これにより、のタプルのセットが得られます(key, value)。次にそれを渡してdict()重複がある場合、「最後の」値が使用されますが、セット(ビュー自体とは異なり)は順序付けされていないため、結合されたアイテムの「最初」になる保証はありません。セット、つまり、どちらが「勝つ」かは任意です。

したがって、要するに、順序/重複の選択が重要でない限り、次のようになります。

dict(d1.items() | d2.items())

Python 2では、dict.items()単に、を返しますlist。ここで、アプローチが機能します。

于 2012-11-13T13:28:08.507 に答える
29

python3で、明らかに追加できないdict.items()タイプのオブジェクトを返します。dict_items(Python 2では、追加可能なaが返さlistれました)。

py2kとpy3kで機能する辞書のペアを追加する別の方法:

d = dict1.copy()
d.update(dict2)

もちろん、キーが衝突した場合に何をしたいのかについては、あいまいさがあります。たとえば、両方のdictにが含まれている場合、どちらを出力に保存key1する必要がありますか?key1または、両方の値を組み合わせて使用​​する必要がありますか?後者の場合、おそらくcollectionsモジュールから何かが必要になります(defaultdictまたはCounter

于 2012-11-13T13:28:18.843 に答える
14

他の提案された答えへの別のアプローチは次のとおりです。

dict(list(d1.items()) + list(d2.items()))

d1との両方にキーが存在する場合d2、の値がd2最終的な辞書で使用されます。

于 2018-11-19T14:19:38.917 に答える