【Pythonの辞書を使いこなせ!】setdefaultの活用方法

どうも、きっしゅです。

Pythonでのプログラムの作成がある程度慣れてくると、高度な実装にも手を出したくなると思います。

本記事ではPythonの辞書の高度な活用方法、setdefaultの使い方、活用方法を紹介します。

辞書型のデータを扱う時の1番のリスクは「キーが存在しないこと」だと思います。キーが存在しないとエラーが発生し、エラーハンドリングをしっかりとしていないとそこで処理が強制終了されてしまいます。

今回紹介するsetdefault()関数はキーが存在しないことによるエラーを防ぐのはもちろん、キーがない場合は新しい要素を追加してくれます。
そのためキーの存在有無を気にせず実装をすることができるため非常に便利です。

setdefault()関数を使いこなすことができると一気に実装の幅が広がり、今まで複雑に実装していたコードが非常にシンプルなコードになると思います。

是非参考にしてください!

※本記事はPythonの辞書型に関する基本的な理解がある前提です。そもそも辞書型ってなに?って方は下記の記事を参考に基礎の部分の理解を優先することをお勧めしします。

setdefaultの活用方法

setdefaultの使い方と活用方法

setdefault()関数は簡単に説明するとget()関数の機能を強化したバージョンだと思えばいいです。

存在しないキーを指定して値を取り出してもエラーが発生しない、またキーが存在しなかった時に任意の値を返すことができるのがget()関数でした。

setdefault()関数はそのget()関数の機能に加え、キーが存在しなかったらそのキーと任意の値を辞書に追加します。

ではさっそくsetdefault()関数の使い方を見てみましょう。

setdefaultの使い方

setdefaultを使う場合は下記のように書きます。

dict_ = {}
value = dict_.setdefault(キー名, 値)

実際にサンプルコードを使って動きを見てみましょう。

dict_ = {
    'Name': 'Taro',
    'Age': 25,
}
print(f'Initial data     -> {dict_}')
# Initial data     -> {'Name': 'Taro', 'Age': 25}


# Try to accessing From
value = dict_.setdefault('From', 'Tokyo')
print(f'After setdefault -> {dict_}')
print(f'Return value     -> {value}')
# After setdefault -> {'Name': 'Taro', 'Age': 25, 'From': 'Tokyo'}
# Return value     -> Tokyo


# Try to accessing Name
value_2 = dict_.setdefault('Name', 'Jiro')
print(f'After setdefault -> {dict_}')
print(f'Return value     -> {value_2}')
# After setdefault -> {'Name': 'Taro', 'Age': 25, 'From': 'Tokyo'}
# Return value     -> Taro


# Try to accessing Weight without 2nd args
value_3 = dict_.setdefault('Weight')
print(f'After setdefault -> {dict_}')
print(f'Return value     -> {value_3}')
# After setdefault -> {'Name': 'Taro', 'Age': 25, 'From': 'Tokyo', 'Weight': None}
# Return value     -> None

まず、10行目で辞書に存在しないFromキーでアクセスを試みました。その結果、辞書にはFromが追加され、また返り値として第二引数に設定したTokyoが返ってきています。

次に18行目では、すでにキーが存在するNameで辞書にアクセスを試みました。その結果、辞書には変化がなく、返り値としてはすでに辞書が持っていた値であるTaroが返ってきています。
第二引数に設定した値は無視されています。

最後に26行目で第二引数を設定せずに存在しないキーにアクセスを試みました。その結果、新しく追加された要素の値はNoneになっています。

この動きよりsetdefault()関数の動きは下記のようにまとめることができます。

  • 存在しないキーにアクセスしてもエラーが発生しない。
  • 存在しないキーにアクセスした場合、第二引数に設定した値が返り値として返ってくる。
  • 存在しないキーにアクセスした場合、第一引数をキーとして、第二引数を値として要素を辞書に追加する
  • 存在するキーにアクセスした場合、第二引数は無視されてすでに辞書に入っている値が返ってくる
  • 存在しないキーにアクセスする時に、第二引数を設定しなかったら値がNoneの要素が追加される

これでsetdefaultがどのような動きをするかを理解することができたと思います。

続いては、このsetdefaultが実際にどのような場面で活用することができるかを紹介します。

setdefaultの活用方法

setdefaultが特に活躍するのは辞書の中の辞書を操作する時です。辞書(A)が持つ値が辞書(B)である場合、辞書(B)に対して操作できるのが強みです。

サンプルコードを書いてみるとこんな感じです。

dict_ = {
    'name': 'Taro',
    'age': 25,
    'exam_score': {
        'Japanese': 70,
        'English': 85,
    }
}
print(f'Initial data     -> {dict_}')
# {'name': 'Taro', 'age': 25, 'exam_score': {'Japanese': 70, 'English': 85}}


# Try to accessing exam_score
exam_score = dict_.setdefault('exam_score', {})
# print(f'Return value     -> {exam_score}')
# {'Japanese': 70, 'English': 85}


# Try to accessing Math with setdefault
math_score = dict_.setdefault('exam_score', {}).setdefault('Math', 90)
print(f'After setdefault -> {dict_}')
print(f'Return value     -> {math_score}')
# {'name': 'Taro', 'age': 25, 'exam_score': {'Japanese': 70, 'English': 85, 'Math': 90}}
# 90

score = dict_.get('exam_score')
print(f'After add math   -> {score}')
# {'Japanese': 70, 'English': 85, 'Math': 90}


# Try to accessing ranking-Math
math_ranking = dict_.setdefault('ranking', {}).setdefault('Math', 5)
ranking = dict_.get('ranking')
print(f'After setdefault -> {dict_}')
print(f'Return value     -> {math_ranking}')
print(f'Return value     -> {ranking}')

まずは20行目。ここではすでに存在するexam_scoreにアクセスを試みて、そのアクセスした値のMathに対してアクセスを試みています。その結果、exam_scoreはすでに存在している要素が返ってきて、Mathは存在しなかったため、exam_scoreの要素として追加されました。

27行目の出力結果からも追加されていることがわかると思います。

続いて32行目。ここでは存在しないキーの要素(ranking)に対して、Mathというキーでアクセスを試みています。ranking自体が存在しないので、当然その中のMathも存在しません。

ですが結果は出力を見てわかるように、rankingというキーが作成されて、さらのその値にMathというキーを持つ要素が作成されています。

このようにsetdefault()関数を活用すればネストの深い要素の作成も比較的簡単にできます。

setdefault()関数はネスト構造を持つ辞書に対しても有効である

まとめ

いかがでしたでしょうか?

今回はsetdefault()関数に関して紹介しました。
シンプルな処理であれば他の方法でも十分代用できます。ですが、ネストが深い辞書を扱うようになればなるほどパワーを発揮します。

データ分析をはじめとしてあらゆる場面で活用できるのでぜひマスターしてみてください!

みなさんの最高のPythonライフの役に立ちますと幸いです。

Python
きっしゅをフォローする
Ibukish Lab+

コメント

  1. […] 【Pythonの辞書を使いこなせ!】defaultdictの活用方法みなさんはPythonの辞書(ディクショナリー)を使いこなしていますか?辞書は非常に多くの可能性を秘めています。本記事ではそんな辞書が持つdefaultdict関数の使い方、活用方法を紹介しています!辞書の使い方をマスターすると実装の幅が広がるので是非参考にしてください!memoribuka-lab.com2020.11.08 【Pythonの辞書を使いこなせ!】setdefaultの活用方法みなさんはPythonの辞書(… […]

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