pythonのreduce()関数を使用しリスト内の独立した辞書をマージ(結合)してみます。
functoolsのreduce()関数,高階関数は、関数の括弧内に、引数,パラメータで渡された特定の関数を、同じく引数,パラメータで渡されたシーケンスに含まれる全てのリスト要素に適用することができます。
■Python
Google Colaboratory(Google Colab),Python3.7.10
■reduce()関数を使用しリスト内独立した辞書をマージする
では、早速reduce()関数を使用しリスト内独立した辞書をマージしてみます。
■コード
from functools import reduce list_test = [{'田中':1,'佐藤':2},{'佐藤':3,'吉田':4},{'佐々木':5}] new_list = reduce(lambda a, b: dict(a, **b), list_test) print(new_list)
reduce()を使用するために、fromとimportを記述します。今回は、list_testというリストを角括弧”[ ]”を使用し定義します。リスト内には、辞書を定義するするために、波括弧”{ }”を使用し、各要素を囲み、コロン”:”でキーと値を格納します。
格納後、new_listという変数を定義し、reduce()を用います。括弧内では、第1の引数,パラメータとして、lambda式を渡します。lambda式では、a,bという2つの引数,パラメータを設定します。lambda式の式では、dict()関数を用いて、辞書型配列を作成します。関数の括弧内には、引数,パラメータとして、aとbを渡します。この時にbの方は、”*”(アスタリスク)2つを用い、可変長の引数とします。これで、今回のlambda式を、reduce()関数の第2の引数,パラメータとして渡したlist_test内の独立した辞書に適用され、lambda式で引数,パラメータとして渡したものを繰り返し処理することで、重複も削除することができます。
最後に、print()関数でnew_list変数内の情報を出力します。
■実行・検証
スクリプトを作成後、このスクリプトを実行してみます。
実行してみると、functoolsのreduce()関数を用いることで、今回指定したlist_testというリスト内の独立した辞書を、1つの辞書として新しく作成し、print()関数で出力させることができました。
■コード
from functools import reduce list_test = [{1:'田中',2:'佐藤'},{3:'佐藤',4:'吉田'},{5:'佐々木'}] new_list = reduce(lambda a, b: dict(a, **b), list_test) print(new_list)
なお、上記のコードで再度実行してみると、下記のERRORが出力されました。
TypeError Traceback (most recent call last) in () 3 list_test = [{1:'田中',2:'佐藤'},{3:'佐藤',4:'吉田'},{5:'佐々木'}] 4 ----> 5 new_list = reduce(lambda a, b: dict(a, **b), list_test) 6 7 print(new_list) in (a, b) 3 list_test = [{1:'田中',2:'佐藤'},{3:'佐藤',4:'吉田'},{5:'佐々木'}] 4 ----> 5 new_list = reduce(lambda a, b: dict(a, **b), list_test) 6 7 print(new_list) TypeError: keywords must be strings
ERRORの内容を確認すると、「キーワードは”文字列”でなければなりません」ということで、辞書のキーと値の、キーの部分は文字列しないといけない。
コメント