辞書型値の結合

2chスレ「Pythonのお勉強Part33」より。面白かったのでちょっとまとめてみました。
http://pc12.2ch.net/test/read.cgi/tech/1240678081/244-

2つをマージした新しい辞書dict3を一発でつくるにはどうしたらいいですか
(...)
D1もD2も変更せずに、かつD1とD2をマージした辞書を一発で新たに作りたい

コード的に短いのは、dict()の引数に辞書1をそのまま渡し、キーワード引数として辞書2を渡す方法。

d = dict(d1, **d2)

これだと2つずつしか結合できないので、3つ以上だとdictの入れ子になります。

d = dict(dict(d1,**d2), **d3)

d.items()を使えば、わりと直感的?な書き方になります。

d = dict(d1.items() + d2.items() + d3.items())

でもPython 3.xはd.items()がイテレータを返すため動きません。itertools.chainを使えば対応できますが…。

from itertools import chain
d = dict(chain(d1.items(), d2.items(), d3.items()))

結局のところ最初copyして逐次updateで集約していく方法が、汎用性が高く、効率もよいものと考えられます。

d = d1.copy()
d.update(d2)
d.update(d3)