pythonのreduce()関数を使用しリスト内の独立した辞書をマージ(結合)する

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の内容を確認すると、「キーワードは”文字列”でなければなりません」ということで、辞書のキーと値の、キーの部分は文字列しないといけない。

コメント

タイトルとURLをコピーしました