アンパック演算子
アンパック演算子
code: 0237_unpack.py
def myfunc(x, y, z):
print(x, y, z)
tuple_data = (1, 0, 1)
dict_data = {'x': 1, 'y': 0, 'z': 1}
dict_data = dict( x=1, y=0, z=1)
myfunc(*tuple_data) # myfunc(1, 0, 1)
myfunc(**dict_data) # myfunc(x=1, y=0, z=1)
これにより、辞書型のデータ連結が簡潔に記述できるようになりました。
とはいえ、互換性に問題があるので注意が必要です。
辞書データの連結処理のコーディングを見比べてみましょう。
辞書アンパッキング演算子 を使った辞書データの連結
辞書アンパッキング演算子を使うと非常に簡潔に記述できます。ただし、動作するPythonがバージョン3.5以降であることが条件となります。
code: 0238_dict_marge_with_unpack.py
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = {**x, **y}
print(z)
ラムダ式を使った辞書データの連結
ラムダ式を2重にする必要があるため読みづらくなります。
code: 0239_dict_marge_with_lambda.py
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = (lambda a, b: (lambda aa: aa.update(b) or aa)(a.copy()))(x, y)
print(z)
辞書内包表記を使った辞書データの連結
for を2重にする必要があるため読みづらくなります。
code: 0240_dict_marge_with_comprehension.py
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = {i:di for d in x,y for i in d} print(z)
辞書オブジェクトからデータを取り出して連結
辞書オブジェクトのitems() メソッドは Python3からリストオブジェクトではなくdict_itemsオブジェクトを返すようになっているため、list() で処理する必要があります。
code: 0241_dict_marge_with_list.py
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = dict(list(x.items()) + list(y.items()))
print(z)
集合演算子を使って辞書型データを連結
集合演算子の和集合(|) を使うと list() で処理する必要がなくなります。
code: 0242_dict_marge_with_set_operator.py
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = dict(x.items() | y.items())
print(z)
chain関数を使った辞書データの連結
code: 0243_dict_merge_with_intertools_chain.py
from itertools import chain
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = dict(chain(x.items(), y.items()))
print(z)
ChainMap関数を使った辞書データの連結
code: 0244_dict_merge_with_collection_chainmap.py
from collections import ChainMap
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = ChainMap({}, x, y)
print(z)
ChainMap()が返すオブジェクトを、辞書型オブジェクトとして扱いたい場合は、次のようにdict() で処理します。
code: 0245_dict_merge_with_collection_chainmap.py
from collections import ChainMap
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = dict(ChainMap(x, y))
print(z)
辞書オブジェクトのメソッドを使った辞書データの連結
辞書オブジェクトの copy()とupdate()メソッドを使う方法です。
この方法は最も互換性に問題がなくて、処理内容もわかりやすいものになります。
code: 0246_dict_merge_with_copy_update.py
x = {'a':1, 'b':2}
y = {'c':3, 'd':4}
z = x.copy() # z=dict() ; z.update(x) と同じ
z.update(y)
print(z)