Python 辞書に要素を追加する方法【初心者向け徹底解説】
Pythonの世界へようこそ!プログラミングを学ぶ上で、データを効率的に扱うことは非常に重要です。様々なデータを扱うための便利なツールの一つに「辞書(Dictionary)」があります。
辞書は、他のプログラミング言語では「ハッシュマップ」や「連想配列」などと呼ばれることもあります。電話帳のように「名前」というキー(見出し)を使って「電話番号」という値を取り出す、といったイメージでデータを管理できるのが大きな特徴です。
この記事では、Pythonの辞書がどのようなものかをおさらいしつつ、新しい要素を辞書に追加する様々な方法について、初心者の方でもつまずかないように、とことん丁寧に、そして多くのコード例を交えながら解説していきます。
この記事を読めば、
- Pythonの辞書がどのようにデータを保持しているか
- 辞書に新しい要素を追加する最も基本的な方法
- 複数の要素をまとめて追加する便利な方法
- 特定の条件を満たす場合だけ要素を追加する方法
など、辞書への要素追加に関するあらゆる疑問が解消されるはずです。約5000語のボリュームで、隅から隅までじっくりと解説していきますので、ぜひ最後までお付き合いください!
はじめに:なぜ辞書は便利なのか?
プログラミングでは、複数のデータを一つのまとまりとして扱うことがよくあります。例えば、ユーザーの名前と年齢、出身地といった情報をまとめて扱いたい場合などです。
このような場合、リスト(List)を使うこともできますが、リストは基本的に「順番」で要素を管理します。例えば user_info = ['山田太郎', 30, '東京都']
のようにリストを作ったとしても、user_info[0]
が名前、user_info[1]
が年齢、user_info[2]
が出身地、という順番を覚えておく必要があります。もし要素の順番が変わったり、新しい情報(例えば身長)を追加したりすると、どのインデックス(順番を表す数字)がどの情報を指しているのかが分かりにくくなってしまいます。
ここで辞書が登場します。辞書は「キー(Key)」と「値(Value)」のペアでデータを保持します。キーは値にアクセスするための「見出し」や「ラベル」のようなものです。先ほどのユーザー情報の例なら、辞書を使うと { '名前': '山田太郎', '年齢': 30, '出身地': '東京都' }
のようにデータを表現できます。
これなら、user_info['名前']
とすれば「山田太郎」が、user_info['年齢']
とすれば 30
が手に入ります。リストのように順番を覚える必要がなく、キーの名前を見ればそれがどんな情報かがすぐにわかるのが、辞書の大きなメリットです。
また、辞書は特定のキーに対応する値を非常に高速に取り出せるという利点もあります。これは、データ量が多くなればなるほど、プログラムの実行速度に大きな影響を与える可能性があります。
このように、辞書は「ラベル付けされたデータを効率的に管理する」のに非常に適したデータ構造なのです。そして、この便利な辞書を使う上で欠かせない操作の一つが、「新しい要素の追加」です。
それでは、具体的にどのようにして辞書に要素を追加していくのかを見ていきましょう。
Section 1: Python辞書の基本をおさらいしよう
要素の追加方法に入る前に、まずはPythonの辞書の基本的な扱い方について簡単におさらいしておきましょう。辞書がどのようなものか、どのように作るのか、そして要素の取得や変更はどのように行うのかを知っておくと、追加方法の理解がスムーズになります。
1.1 辞書は「キー」と「値」のペア
辞書は {}
(波かっこ)を使って表現されます。その中に キー: 値
という形式でペアを記述し、複数のペアがある場合は ,
(カンマ)で区切ります。
例えば、以下のような辞書は、商品のコードと価格を対応させています。
“`python
商品コードをキー、価格を値とする辞書
商品リスト = {
‘A001’: 150,
‘B002’: 280,
‘C003’: 500
}
“`
この例では、'A001'
, 'B002'
, 'C003'
がキーで、150
, 280
, 500
がそれぞれのキーに対応する値です。キーと値は :
で結ばれています。
キーには、文字列、数値、タプルなど、「変更不可能(イミュータブル)」で「ハッシュ可能(hashable)」なオブジェクトを使うことができます。値には、文字列、数値、リスト、他の辞書など、どんな種類のオブジェクトでも指定できます。
1.2 辞書の作成方法
辞書を作成するにはいくつかの方法があります。
方法1: 空の辞書を作成する
まず何も要素が入っていない、空の辞書を作るには、波かっこ {}
を使うか、dict()
という関数を使います。
“`python
波かっこ{}を使って空の辞書を作成
空の辞書1 = {}
print(空の辞書1)
dict()関数を使って空の辞書を作成
空の辞書2 = dict()
print(空の辞書2)
“`
実行結果はどちらも šte{}
となります。ここに後から要素を追加していくことになります。
方法2: 初期値を持つ辞書を作成する
作成と同時にいくつかの要素を持たせたい場合は、先ほどの キー: 値
の形式で波かっこ {}
の中に記述します。
“`python
初期値を持つ辞書を作成
動物の鳴き声 = {
‘犬’: ‘ワンワン’,
‘猫’: ‘ニャーニャー’,
‘牛’: ‘モーモー’
}
print(動物の鳴き声)
“`
実行結果は {'犬': 'ワンワン', '猫': 'ニャーニャー', '牛': 'モーモー'}
のようになります。(Python 3.7以降では、要素が追加された順序が保持されるようになりましたが、それ以前のバージョンでは順序は保証されませんでした。しかし、キーを使って値を取り出すという辞書の基本的な考え方において、順序は必須ではありません。)
dict()
関数を使って初期値を持つ辞書を作成することもできます。例えば、キーと値のペアをタプルのリストとして渡す方法や、キーワード引数として渡す方法があります。
“`python
dict()関数とタプルのリストで作成
フルーツの色 = dict([
(‘りんご’, ‘赤’),
(‘バナナ’, ‘黄色’),
(‘ぶどう’, ‘紫’)
])
print(フルーツの色)
dict()関数とキーワード引数で作成
国の首都 = dict(日本=’東京’, アメリカ=’ワシントンD.C.’, フランス=’パリ’)
print(国の首都)
“`
これらの方法で辞書を作成できますが、要素を追加する際には、主にこの後で説明する方法を使います。
1.3 辞書の要素を取得する方法
辞書に格納されている値を取り出すには、キーを指定します。角かっこ []
の中に取得したい値に対応するキーを記述します。
“`python
先ほど作成した動物の鳴き声辞書から値を取得
print(動物の鳴き声[‘犬’])
print(動物の鳴き声[‘猫’])
“`
実行結果は以下のようになります。
ワンワン
ニャーニャー
もし存在しないキーを指定して値を取得しようとすると、KeyError
というエラーが発生します。
“`python
存在しないキーを指定した場合
print(動物の鳴き声[‘キリン’]) # <– これを実行するとエラーになります!
“`
KeyError
を避けたい場合は、get()
メソッドを使う方法があります。get()
メソッドは、指定したキーが存在しない場合でもエラーにならず、None
を返すか、または第2引数で指定したデフォルト値を返します。
“`python
get()メソッドを使った値の取得
print(動物の鳴き声.get(‘犬’))
print(動物の鳴き声.get(‘キリン’)) # 存在しないキー
print(動物の鳴き声.get(‘キリン’, ‘不明’)) # 存在しない場合のデフォルト値を指定
“`
実行結果は以下のようになります。
ワンワン
None
不明
1.4 辞書の要素を変更する方法(実は追加と同じ構文!)
既存の辞書に格納されている値を変更したい場合も、キーを指定して新しい値を代入します。
“`python
辞書の要素を変更する例
商品の在庫 = {
‘鉛筆’: 100,
‘消しゴム’: 50,
‘ノート’: 30
}
print(f”変更前: {商品の在庫}”)
鉛筆の在庫を減らす
商品の在庫[‘鉛筆’] = 95
print(f”変更後: {商品の在庫}”)
ノートの在庫を増やす
商品の在庫[‘ノート’] = 商品の在庫[‘ノート’] + 20 # または 商品の在庫[‘ノート’] += 20
print(f”さらに変更後: {商品の在庫}”)
“`
実行結果は以下のようになります。
変更前: {'鉛筆': 100, '消しゴム': 50, 'ノート': 30}
変更後: {'鉛筆': 95, '消しゴム': 50, 'ノート': 30}
さらに変更後: {'鉛筆': 95, '消しゴム': 50, 'ノート': 50}
このように、既存のキーを指定して値を代入すると、そのキーに対応する値が新しい値に上書きされます。
実は、辞書に新しい要素を追加する際も、全く同じ構文を使います。これが、辞書への要素追加の最も基本的な方法です。次のセクションで詳しく見ていきましょう。
Section 2: 辞書に新しい要素を「1つ」追加する最も基本的な方法
さて、いよいよ辞書に新しい要素を追加する方法の解説です。最もシンプルでよく使われる方法は、先ほど要素の変更で見た構文と同じです。
新しいキーに値を代入する:
python
dictionary[新しいキー] = 新しい値
この構文は、Pythonの辞書における非常に強力で柔軟な操作です。この1行で、以下の2つの異なる動作を実現します。
- 指定した
新しいキー
が辞書の中にまだ存在しない場合:新しいキー
と新しい値
のペアが、辞書に追加されます。
- 指定した
新しいキー
が辞書の中に既に存在する場合:- そのキーに対応する既存の値が
新しい値
で上書き(更新)されます。
- そのキーに対応する既存の値が
このように、同じ構文で「追加」と「更新」の両方が行われるのがポイントです。今回は「追加」に焦点を当てて見ていきます。
2.1 具体的なコード例:新しい要素を追加する
先ほど作成した空の辞書や、初期値を持つ辞書を使って、新しい要素を追加してみましょう。
例1: 空の辞書に要素を追加する
“`python
まずは空の辞書を作成
学生の点数 = {}
print(f”初期状態: {学生の点数}”)
‘Alice’さんの数学の点数を追加
学生の点数[‘Alice’] = 95
print(f”Aliceを追加後: {学生の点数}”)
‘Bob’さんの英語の点数を追加
学生の点数[‘Bob’] = 88
print(f”Bobを追加後: {学生の点数}”)
“`
実行結果は以下のようになります。
初期状態: {}
Aliceを追加後: {'Alice': 95}
Bobを追加後: {'Alice': 95, 'Bob': 88}
このように、空の辞書に対して存在しないキーを指定して値を代入していくことで、どんどん新しい要素が追加されていくのが分かります。
例2: 既存の辞書に要素を追加する
初期値がいくつか入っている辞書にも、全く同じ方法で新しい要素を追加できます。
“`python
既存の辞書を作成
商品の価格 = {
‘りんご’: 100,
‘バナナ’: 150,
‘オレンジ’: 120
}
print(f”初期状態: {商品の価格}”)
新しい商品「みかん」とその価格を追加
商品の価格[‘みかん’] = 80
print(f”みかんを追加後: {商品の価格}”)
さらに新しい商品「いちご」とその価格を追加
商品の価格[‘いちご’] = 300
print(f”いちごを追加後: {商品の価格}”)
“`
実行結果は以下のようになります。
初期状態: {'りんご': 100, 'バナナ': 150, 'オレンジ': 120}
みかんを追加後: {'りんご': 100, 'バナナ': 150, 'オレンジ': 120, 'みかん': 80}
いちごを追加後: {'りんご': 100, 'バナナ': 150, 'オレンジ': 120, 'みかん': 80, 'いちご': 300}
既存のキーの値を変更する場合と、新しいキーで要素を追加する場合とで、全く同じ dictionary[キー] = 値
という構文を使っていることが確認できます。Pythonが内部で、指定されたキーが辞書に存在するかどうかを判断し、存在すれば更新、存在しなければ追加という処理を自動で行ってくれます。
2.2 追加する「値」はどんな型でもOK!
辞書に追加する値は、数値や文字列だけでなく、リスト、タプル、別の辞書、さらにはカスタムオブジェクトなど、どんなデータ型でも指定できます。これも辞書の柔軟性の一つです。
例3: 値にリストや辞書を指定して追加する
“`python
ユーザーの情報を格納する辞書
user_profile = {
‘name’: ‘田中一郎’,
‘age’: 25
}
print(f”初期状態: {user_profile}”)
趣味のリストを追加
user_profile[‘hobbies’] = [‘読書’, ‘映画鑑賞’, ‘ハイキング’]
print(f”趣味のリストを追加後: {user_profile}”)
住所を別の辞書として追加(ネストした辞書)
user_profile[‘address’] = {
‘city’: ‘大阪市’,
‘zip_code’: ‘530-0001’
}
print(f”住所の辞書を追加後: {user_profile}”)
追加したネストした辞書の中の要素にアクセスすることも可能
print(f”ユーザーの住所: {user_profile[‘address’][‘city’]}”)
“`
実行結果は以下のようになります。
初期状態: {'name': '田中一郎', 'age': 25}
趣味のリストを追加後: {'name': '田中一郎', 'age': 25, 'hobbies': ['読書', '映画鑑賞', 'ハイキング']}
住所の辞書を追加後: {'name': '田中一郎', 'age': 25, 'hobbies': ['読書', '映画鑑賞', 'ハイキング'], 'address': {'city': '大阪市', 'zip_code': '530-0001'}}
ユーザーの住所: 大阪市
このように、値には複雑なデータ構造もそのまま格納できます。これにより、より複雑なデータも辞書を使って整理して管理できるようになります。
2.3 追加する「キー」の型について
キーには、先ほども触れたように「変更不可能(イミュータブル)」で「ハッシュ可能」なオブジェクトを使う必要があります。一般的には文字列や数値がよく使われますが、タプルも条件を満たせばキーとして使えます。
例4: 様々な型のキーで要素を追加する
“`python
様々な型のキーを持つ辞書
my_data = {}
print(f”初期状態: {my_data}”)
文字列キー
my_data[‘名前’] = ‘佐藤’
print(f”文字列キーを追加後: {my_data}”)
整数キー
my_data[123] = ‘数値キーの値’
print(f”整数キーを追加後: {my_data}”)
浮動小数点数キー(あまり一般的ではないが、イミュータブルなので可能)
my_data[3.14] = ‘円周率’
print(f”浮動小数点数キーを追加後: {my_data}”)
タプルキー(要素が全てハッシュ可能であれば可能)
my_data[(1, 2)] = ‘座標’
print(f”タプルキーを追加後: {my_data}”)
実行例(リストはキーにできません!)
my_data[[‘a’, ‘b’]] = ‘リストキーの値’ # <– これはTypeErrorになります!
“`
実行結果は以下のようになります。
初期状態: {}
文字列キーを追加後: {'名前': '佐藤'}
整数キーを追加後: {'名前': '佐藤', 123: '数値キーの値'}
浮動小数点数キーを追加後: {'名前': '佐藤', 123: '数値キーの値', 3.14: '円周率'}
タプルキーを追加後: {'名前': '佐藤', 123: '数値キーの値', 3.14: '円周率', (1, 2): '座標'}
リストや辞書といったミュータブルなオブジェクトはハッシュ可能ではないため、辞書のキーとして使うことはできません。これを使おうとすると TypeError: unhashable type: 'list'
のようなエラーが発生します。この「ハッシュ可能性」については、後ほど「注意点」のセクションで改めて詳しく解説します。
2.4 この方法のまとめ
dictionary[新しいキー] = 値
という方法は、辞書に要素を1つ追加する際に最も直感的で簡単な方法です。新しいキーを指定すれば追加、既存のキーを指定すれば更新、というシンプルなルールなので覚えやすいです。
ただし、この方法で複数の要素を追加したい場合は、追加したい要素の数だけこの行を書く必要があります。例えば3つの要素を追加したいなら3行書くことになります。
“`python
3つの要素を追加したい場合
my_dict = {}
my_dict[‘key1’] = ‘value1’
my_dict[‘key2’] = ‘value2’
my_dict[‘key3’] = ‘value3’
print(my_dict)
“`
このように、追加する要素が少ない場合はこれで十分ですが、多くの要素をまとめて追加したい場合は、もっと効率的な方法があります。それが次に紹介する update()
メソッドです。
Section 3: 辞書に複数の要素をまとめて追加・更新する update()
メソッド
複数の要素を一度に辞書に追加したり、既存の要素をまとめて更新したりしたい場合に便利なのが、辞書の update()
メソッドです。
update()
メソッドは、他の辞書や、キーと値のペアを持つイテラブル(リストやタプルなど)の内容を使って、呼び出し元の辞書を更新します。ここで言う「更新」とは、「新しいキーがあれば追加し、既存のキーがあれば値を上書きする」という操作のことです。
update()
メソッドにはいくつかの引数の渡し方があり、それぞれ少しずつ使い方が異なります。順番に見ていきましょう。
3.1 update(他の辞書)
形式
最も一般的な使い方は、別の辞書オブジェクトを引数として渡す方法です。引数として渡された辞書のすべての要素が、呼び出し元の辞書に追加または更新されます。
“`python
基本となる辞書
dict1 = {‘a’: 1, ‘b’: 2}
print(f”初期状態: {dict1}”)
追加・更新用の辞書
dict2 = {‘b’: 20, ‘c’: 30}
dict1をdict2で更新
dict1.update(dict2)
print(f”dict2で更新後: {dict1}”)
“`
実行結果は以下のようになります。
初期状態: {'a': 1, 'b': 2}
dict2で更新後: {'a': 1, 'b': 20, 'c': 30}
解説:
- 初期状態の
dict1
は{'a': 1, 'b': 2}
です。 dict1.update(dict2)
を実行すると、dict2
の各要素 ('b': 20
,'c': 30
) がdict1
に反映されます。- キー
'b'
はdict1
に既に存在するため、その値2
が20
に上書きされます。 - キー
'c'
はdict1
に存在しないため、新しい要素'c': 30
がdict1
に追加されます。 - 結果として、
dict1
は{'a': 1, 'b': 20, 'c': 30}
となります。
このように、update()
メソッドに辞書を渡すことで、複数の要素の追加と更新を一度に行えます。これは、例えば設定情報をデフォルト値で初期化しておき、後からユーザーが指定した設定値で上書き・追加する、といった場面で非常に役立ちます。
3.2 update(キーと値のペアのイテラブル)
形式
update()
メソッドには、キーと値のペアを持つイテラブル(リストやタプルのリスト/タプルなど)を渡すこともできます。このイテラブルは、(キー, 値)
の形式を持つ要素を順番に取り出せるものであれば何でも構いません。最も一般的なのは、タプルを要素とするリストです。
“`python
基本となる辞書
my_settings = {‘timeout’: 30, ‘retry’: 3}
print(f”初期状態: {my_settings}”)
追加・更新用のキーと値のペアのリスト
new_settings = [(‘retry’, 5), (‘delay’, 10), (‘log_level’, ‘info’)]
my_settingsをnew_settingsで更新
my_settings.update(new_settings)
print(f”リストで更新後: {my_settings}”)
“`
実行結果は以下のようになります。
初期状態: {'timeout': 30, 'retry': 3}
リストで更新後: {'timeout': 30, 'retry': 5, 'delay': 10, 'log_level': 'info'}
解説:
- 初期状態の
my_settings
は{'timeout': 30, 'retry': 3}
です。 my_settings.update(new_settings)
を実行すると、new_settings
リストの各タプル('retry', 5)
,('delay', 10)
,('log_level', 'info')
が順番に処理されます。- タプル
('retry', 5)
のキー'retry'
はmy_settings
に存在するため、値3
が5
に上書きされます。 - タプル
('delay', 10)
のキー'delay'
は存在しないため、新しい要素'delay': 10
が追加されます。 - タプル
('log_level', 'info')
のキー'log_level'
は存在しないため、新しい要素'log_level': 'info'
が追加されます。 - 結果として、
my_settings
は{'timeout': 30, 'retry': 5, 'delay': 10, 'log_level': 'info'}
となります。
この形式は、特にデータベースから取得した結果のような、「キーと値のペアのリスト」としてデータが手元にある場合に便利です。例えば、CSVファイルを読み込んで各行を辞書の要素として扱いたい場合などに応用できます。
3.3 update(キーワード引数)
形式
update()
メソッドは、キーワード引数としてキーと値を直接渡すこともできます。この形式は、追加したいキーの名前が静的(プログラムを書いている時点で決まっている)である場合に、非常に直感的で読みやすく記述できます。
ただし、この形式で指定できるキーは、有効なPythonの識別子(変数名などとして使える名前)である必要があります。つまり、スペースを含んでいたり、数字で始まったりする文字列はキーワード引数として使えません。文字列以外の型のキーも使えません。
“`python
基本となる辞書
user_info = {‘id’: 101, ‘name’: ‘Alice’}
print(f”初期状態: {user_info}”)
キーワード引数で追加・更新
user_info.update(name=’Alice Smith’, email=’[email protected]’, city=’New York’)
print(f”キーワード引数で更新後: {user_info}”)
無効なキー名(スペースを含む)を使おうとするとエラー
user_info.update(zip code=’10001′) # <– SyntaxErrorになります!
数字から始まるキーを使おうとするとエラー
user_info.update(1st_login=’…’)# <– SyntaxErrorになります!
“`
実行結果は以下のようになります。
初期状態: {'id': 101, 'name': 'Alice'}
キーワード引数で更新後: {'id': 101, 'name': 'Alice Smith', 'email': '[email protected]', 'city': 'New York'}
解説:
- 初期状態の
user_info
は{'id': 101, 'name': 'Alice'}
です。 user_info.update(name='Alice Smith', email='[email protected]', city='New York')
を実行すると、渡されたキーワード引数が処理されます。- キーワード引数
name='Alice Smith'
のキー'name'
はuser_info
に存在するため、値'Alice'
が'Alice Smith'
に上書きされます。 - キーワード引数
email='[email protected]'
のキー'email'
は存在しないため、新しい要素'email': '[email protected]'
が追加されます。 - キーワード引数
city='New York'
のキー'city'
は存在しないため、新しい要素'city': 'New York'
が追加されます。 - 結果として、
user_info
は{'id': 101, 'name': 'Alice Smith', 'email': '[email protected]', 'city': 'New York'}
となります。
この形式は、特に決められた少数の情報を辞書に追加・更新したい場合に、コードがすっきりして読みやすくなるという利点があります。ただし、キーとして使える文字列に制限がある点には注意が必要です。
3.4 異なる update
形式の組み合わせ
update()
メソッドは、上記の形式を組み合わせて使用することもできます。例えば、位置引数として辞書またはキー・値ペアのイテラブルを1つ渡し、さらにキーワード引数を複数渡す、といったことができます。
“`python
基本となる辞書
product = {‘id’: ‘P10’, ‘name’: ‘Gadget’}
print(f”初期状態: {product}”)
別の辞書形式の更新情報
details = {‘price’: 5000, ‘stock’: 10}
キーワード引数形式の追加情報
extra_info = {‘category’: ‘Electronics’, ‘brand’: ‘ABC’}
details辞書の内容とextra_infoキーワード引数を組み合わせて更新
product.update(details, category=’Electronics’, brand=’ABC’)
または product.update(details, **extra_info) としても同じ意味になる場合があります
print(f”組み合わせ更新後: {product}”)
“`
実行結果は以下のようになります。
初期状態: {'id': 'P10', 'name': 'Gadget'}
組み合わせ更新後: {'id': 'P10', 'name': 'Gadget', 'price': 5000, 'stock': 10, 'category': 'Electronics', 'brand': 'ABC'}
解説:
- 初期状態の
product
は{'id': 'P10', 'name': 'Gadget'}
です。 product.update(details, category='Electronics', brand='ABC')
を実行すると、まず位置引数として渡されたdetails
辞書の内容 ('price': 5000
,'stock': 10
) が処理されます。これらのキーは存在しないため、追加されます。- 次に、キーワード引数
category='Electronics'
とbrand='ABC'
が処理されます。これらのキーも存在しないため、それぞれ追加されます。 - 結果として、
product
は{'id': 'P10', 'name': 'Gadget', 'price': 5000, 'stock': 10, 'category': 'Electronics', 'brand': 'ABC'}
となります。
このように、複数の情報源から辞書を構築したり更新したりする際に、update()
メソッドは非常に柔軟に対応できます。
3.5 update()
メソッドのまとめ
update()
メソッドは、複数のキーと値のペアを一度に辞書に追加・更新したい場合に非常に便利な方法です。
- 別の辞書を渡す (
update(other_dict)
) - キーと値のペアのイテラブル(リストなど)を渡す (
update([(k1, v1), (k2, v2)])
) - キーワード引数を渡す (
update(k1=v1, k2=v2)
)
これらの形式を使い分けることで、プログラムの読みやすさやデータの形式に合わせて効率的に辞書を操作することができます。特に、多くの要素をまとめて追加・更新する場面では、ループを使って dictionary[key] = value
を繰り返すよりも、update()
を使う方がコードが簡潔になり、一般的にはパフォーマンスも優れています。
Section 4: キーが存在しない場合だけ追加したい? setdefault()
を使おう
辞書に要素を追加したいけれど、「もし既にそのキーが存在するなら何もしないで、存在しない場合にだけ特定のデフォルト値で追加したい」というケースがあります。このような場合に便利なのが setdefault()
メソッドです。
setdefault()
メソッドは、以下の2つの動作をします。
- 指定した
key
が辞書の中に既に存在する場合:- そのキーに対応する値をそのまま返します。
- 辞書には何も変更を加えません。
- 指定した
key
が辞書の中にまだ存在しない場合:key
とdefault_value
のペアを辞書に追加します。default_value
を返します。
構文は以下の通りです。
python
dictionary.setdefault(key, default_value)
default_value
は省略することも可能ですが、省略した場合はキーが存在しないときに None
が値として設定されます。通常は何か意味のあるデフォルト値を指定します。
4.1 具体的なコード例:setdefault()
の使い方
setdefault()
の動作を具体的なコードで確認してみましょう。
“`python
テスト用の辞書
my_dict = {‘name’: ‘Alice’, ‘age’: 30}
print(f”初期状態: {my_dict}”)
例1: 存在するキーを指定した場合
キー ‘name’ は存在する
value = my_dict.setdefault(‘name’, ‘Unknown’)
print(f”setdefault(‘name’, ‘Unknown’)の結果: {value}”)
print(f”処理後の辞書: {my_dict}”) # 辞書は変わらない
print(“-” * 20) # 区切り線
例2: 存在しないキーを指定した場合
キー ‘city’ は存在しない
value = my_dict.setdefault(‘city’, ‘Tokyo’)
print(f”setdefault(‘city’, ‘Tokyo’)の結果: {value}”)
print(f”処理後の辞書: {my_dict}”) # 新しい要素が追加されている
print(“-” * 20) # 区切り線
例3: 存在しないキーを指定し、デフォルト値を省略した場合
キー ‘country’ は存在しない
value = my_dict.setdefault(‘country’) # デフォルト値を省略
print(f”setdefault(‘country’)の結果: {value}”)
print(f”処理後の辞書: {my_dict}”) # 値としてNoneが追加されている
“`
実行結果は以下のようになります。
“`
初期状態: {‘name’: ‘Alice’, ‘age’: 30}
setdefault(‘name’, ‘Unknown’)の結果: Alice
処理後の辞書: {‘name’: ‘Alice’, ‘age’: 30}
setdefault(‘city’, ‘Tokyo’)の結果: Tokyo
処理後の辞書: {‘name’: ‘Alice’, ‘age’: 30, ‘city’: ‘Tokyo’}
setdefault(‘country’)の結果: None
処理後の辞書: {‘name’: ‘Alice’, ‘age’: 30, ‘city’: ‘Tokyo’, ‘country’: None}
“`
この例から、setdefault()
がキーの存在を確認し、存在しない場合だけ指定されたデフォルト値で要素を追加する様子が分かります。
4.2 setdefault()
が便利なシナリオ
setdefault()
は、特に以下の様なシナリオで非常に役立ちます。
シナリオ1: 要素のカウント
リストや他のイテラブルに含まれる各要素が何回出現するかを数えたい場合。
“`python
文字列のリスト
words = [‘apple’, ‘banana’, ‘apple’, ‘orange’, ‘banana’, ‘apple’]
各単語の出現回数を記録する辞書
word_counts = {}
リストをループしながらカウント
for word in words:
# wordが辞書に存在しない場合は、初期値0で追加し、その値(0)を取得
# wordが辞書に存在する場合は、現在のカウント値を取得
current_count = word_counts.setdefault(word, 0)
# 取得した値に1を加えて、辞書を更新
# setdefaultが返す値(追加した0か、既存の値)を使って更新
word_counts[word] = current_count + 1
または、よりシンプルに:
for word in words:
word_counts[word] = word_counts.setdefault(word, 0) + 1
print(f”単語の出現回数: {word_counts}”)
“`
実行結果は以下のようになります。
単語の出現回数: {'apple': 3, 'banana': 2, 'orange': 1}
解説:
ループの中で word_counts.setdefault(word, 0)
を実行しています。
- 最初の
'apple'
が出てきたとき、'apple'
はword_counts
に存在しません。setdefault('apple', 0)
は'apple': 0
を辞書に追加し、値0
を返します。current_count
は0
になります。word_counts['apple'] = 0 + 1
で'apple'
の値が1
に更新されます。 - 次に
'banana'
が出てきたとき、'banana'
は存在しません。setdefault('banana', 0)
は'banana': 0
を追加し、値0
を返します。word_counts['banana'] = 0 + 1
で'banana'
の値が1
に更新されます。 - 三番目に
'apple'
が出てきたとき、'apple'
は既に存在します。setdefault('apple', 0)
は辞書を変更せず、既存の値1
を返します。current_count
は1
になります。word_counts['apple'] = 1 + 1
で'apple'
の値が2
に更新されます。
このように、setdefault()
を使うことで、「キーが存在するかどうかを確認して、存在しなければ初期値で追加し、存在すれば現在の値を取得する」という一連の処理を効率的に行うことができます。
シナリオ2: 要素のグループ化
ある基準に基づいて要素をグループ分けし、グループごとにリストなどのまとまりとして辞書に格納したい場合。
“`python
人物のリスト(それぞれ名前と都市の情報を持つ辞書)
people = [
{‘name’: ‘Alice’, ‘city’: ‘Tokyo’},
{‘name’: ‘Bob’, ‘city’: ‘Osaka’},
{‘name’: ‘Charlie’, ‘city’: ‘Tokyo’},
{‘name’: ‘David’, ‘city’: ‘Nagoya’},
{‘name’: ‘Eve’, ‘city’: ‘Osaka’}
]
都市ごとに人物をグループ化する辞書
people_by_city = {}
リストをループしながらグループ化
for person in people:
city = person[‘city’]
name = person[‘name’]
# cityが辞書に存在しない場合は、初期値として空のリスト[]を追加し、そのリストを取得
# cityが辞書に存在する場合は、既存のリストを取得
city_list = people_by_city.setdefault(city, [])
# 取得したリストに現在の人物の名前を追加
city_list.append(name)
print(f”都市別人物リスト: {people_by_city}”)
“`
実行結果は以下のようになります。
都市別人物リスト: {'Tokyo': ['Alice', 'Charlie'], 'Osaka': ['Bob', 'Eve'], 'Nagoya': ['David']}
解説:
ループの中で people_by_city.setdefault(city, [])
を実行しています。
- 最初の
'Tokyo'
が出てきたとき、'Tokyo'
は存在しません。setdefault('Tokyo', [])
は'Tokyo': []
を辞書に追加し、空のリスト[]
を返します。city_list
は[]
になります。city_list.append('Alice')
でこのリストに'Alice'
が追加され、people_by_city
は{'Tokyo': ['Alice']}
となります。 - 次に
'Osaka'
が出てきたとき、'Osaka'
は存在しません。setdefault('Osaka', [])
は'Osaka': []
を辞書に追加し、空のリスト[]
を返します。city_list
は[]
になります。city_list.append('Bob')
でこのリストに'Bob'
が追加され、people_by_city
は{'Tokyo': ['Alice'], 'Osaka': ['Bob']}
となります。 - 三番目に
'Tokyo'
が出てきたとき、'Tokyo'
は既に存在します。setdefault('Tokyo', [])
は辞書を変更せず、既存のリスト['Alice']
を返します。city_list
は['Alice']
になります。city_list.append('Charlie')
でこのリストに'Charlie'
が追加され、people_by_city
は{'Tokyo': ['Alice', 'Charlie'], 'Osaka': ['Bob']}
となります。
このように、setdefault()
を使うと、「キーが存在しない場合にだけ特定のデフォルト値(この場合は空のリスト)で要素を追加し、その後その値(リスト)を操作する」というパターンが非常に簡潔に記述できます。
4.3 get()
メソッドとの違い
setdefault()
と似たメソッドに get()
があります。get()
もキーが存在しない場合にエラーにならないという点は共通していますが、決定的な違いはget()
は辞書に要素を追加しないという点です。
“`python
my_dict = {‘a’: 1}
get() はキーが存在しない場合、Noneまたはデフォルト値を返すだけ
value_get = my_dict.get(‘b’, 0)
print(f”get(‘b’, 0)の結果: {value_get}”)
print(f”get()実行後の辞書: {my_dict}”) # 辞書は変わらない
print(“-” * 20)
setdefault() はキーが存在しない場合、要素を追加し、その値を返す
value_setdefault = my_dict.setdefault(‘c’, 0)
print(f”setdefault(‘c’, 0)の結果: {value_setdefault}”)
print(f”setdefault()実行後の辞書: {my_dict}”) # 新しい要素が追加されている
“`
実行結果は以下のようになります。
“`
get(‘b’, 0)の結果: 0
get()実行後の辞書: {‘a’: 1}
setdefault(‘c’, 0)の結果: 0
setdefault()実行後の辞書: {‘a’: 1, ‘c’: 0}
“`
このように、単に値を取得したいだけであれば get()
を、キーが存在しない場合に要素を追加したい場合は setdefault()
を使うのが適切です。setdefault()
は、「取得」と「条件付き追加」を同時に行える便利なメソッドと言えます。
4.4 setdefault()
のまとめ
setdefault(key, default_value)
メソッドは、「キーが存在しない場合のみ key: default_value
を追加し、その値を取得する」という、条件付きの追加と取得を同時に行うことができるメソッドです。
- キーが存在すれば、辞書は変更されず、既存の値が返される。
- キーが存在しなければ、新しい要素が追加され、
default_value
が返される。
要素のカウントやグループ化など、「キーがあれば既存の値を使い、なければ初期値で始める」という処理を効率的に記述するのに非常に役立ちます。
Section 5: 少し応用:fromkeys()
による辞書の作成と要素追加の関連
ここまでは、既存の辞書に要素を追加する方法を見てきましたが、少し関連する操作として、複数のキーを持つ新しい辞書を効率的に作成する dict.fromkeys()
というクラスメソッドを紹介します。これは厳密には「追加」の操作ではありませんが、複数の要素を持つ辞書を生成する方法として知っておくと便利です。
dict.fromkeys()
メソッドは、指定したキーのリスト(またはその他のイテラブル)から新しい辞書を作成し、全てのキーに対して同じデフォルト値を設定します。
構文は以下の通りです。
python
dict.fromkeys(keys_iterable, value=None)
keys_iterable
: 新しい辞書のキーとして使いたい要素を含むイテラブル(リスト、タプル、セットなど)。value
(省略可能): 新しい辞書の全てのキーに設定したい値。省略した場合、デフォルト値はNone
になります。
5.1 具体的なコード例:fromkeys()
の使い方
“`python
キーとして使いたい要素のリスト
items = [‘apple’, ‘banana’, ‘orange’]
例1: デフォルト値を指定しない場合 (Noneが値になる)
inventory1 = dict.fromkeys(items)
print(f”デフォルト値なしの場合: {inventory1}”)
例2: デフォルト値を指定する場合
inventory2 = dict.fromkeys(items, 0)
print(f”デフォルト値0の場合: {inventory2}”)
セット(Set)をキーのイテラブルとして使うことも可能
unique_colors = {‘red’, ‘green’, ‘blue’}
color_codes = dict.fromkeys(unique_colors, ‘#000000’)
print(f”セットをキーとして使用: {color_codes}”)
“`
実行結果は以下のようになります。
デフォルト値なしの場合: {'apple': None, 'banana': None, 'orange': None}
デフォルト値0の場合: {'apple': 0, 'banana': 0, 'orange': 0}
セットをキーとして使用: {'red': '#000000', 'green': '#000000', 'blue': '#000000'}
このように、いくつかの決まったキーを持つ辞書を、初期値を同じにして素早く作りたい場合に dict.fromkeys()
は便利です。例えば、複数のカウンターを0で初期化したい場合などに使えます。
5.2 デフォルト値がミュータブルな場合の注意点
dict.fromkeys()
を使う際に一つ注意が必要な点があります。それは、デフォルト値としてリストや辞書のようなミュータブル(変更可能)なオブジェクトを指定した場合です。
“`python
ミュータブルなデフォルト値としてリストを指定
initial_list = []
student_records = dict.fromkeys([‘Alice’, ‘Bob’, ‘Charlie’], initial_list)
print(f”初期状態: {student_records}”)
Aliceさんの記録に要素を追加
student_records[‘Alice’].append(‘Math: 90’)
print(f”Aliceさんの記録を追加後: {student_records}”) # !!! 注意 !!!
Bobさんの記録に要素を追加
student_records[‘Bob’].append(‘Science: 85’)
print(f”Bobさんの記録を追加後: {student_records}”) # !!! 注意 !!!
“`
実行結果は以下のようになります。
初期状態: {'Alice': [], 'Bob': [], 'Charlie': []}
Aliceさんの記録を追加後: {'Alice': ['Math: 90'], 'Bob': ['Math: 90'], 'Charlie': ['Math: 90']} # Aliceだけではなく、全員のリストが変わっている!
Bobさんの記録を追加後: {'Alice': ['Math: 90', 'Science: 85'], 'Bob': ['Math: 90', 'Science: 85'], 'Charlie': ['Math: 90', 'Science: 85']} # Bobだけではなく、全員のリストが変わっている!
解説:
dict.fromkeys(['Alice', 'Bob', 'Charlie'], initial_list)
とした場合、initial_list
という全く同じ一つのリストオブジェクトが、全てのキー 'Alice'
, 'Bob'
, 'Charlie'
の値として設定されます。
したがって、student_records['Alice'].append('Math: 90')
のように、どれか一つのキーに対応するリストを変更すると、それは同じリストオブジェクトに対する変更なので、他の全てのキーに対応する値も一緒に変更されてしまうのです。
このような振る舞いを避けたい場合は、リスト内包表記などを使って、キーごとに個別のミュータブルオブジェクトを作成する必要があります。
“`python
キーとして使いたい要素のリスト
student_names = [‘Alice’, ‘Bob’, ‘Charlie’]
リスト内包表記を使って、キーごとに新しい空のリストを生成
student_records_correct = {name: [] for name in student_names}
print(f”初期状態(正しい方法): {student_records_correct}”)
Aliceさんの記録に要素を追加
student_records_correct[‘Alice’].append(‘Math: 90’)
print(f”Aliceさんの記録を追加後: {student_records_correct}”)
Bobさんの記録に要素を追加
student_records_correct[‘Bob’].append(‘Science: 85’)
print(f”Bobさんの記録を追加後: {student_records_correct}”)
“`
実行結果は以下のようになります。
初期状態(正しい方法): {'Alice': [], 'Bob': [], 'Charlie': []}
Aliceさんの記録を追加後: {'Alice': ['Math: 90'], 'Bob': [], 'Charlie': []} # Aliceさんのリストだけが変わった
Bobさんの記録を追加後: {'Alice': ['Math: 90'], 'Bob': ['Science: 85'], 'Charlie': []} # Bobさんのリストだけが変わった
このように、ミュータブルなオブジェクトをデフォルト値として複数のキーに設定したい場合は、dict.fromkeys()
ではなく、キーごとに新しいオブジェクトを生成する方法(例えば辞書内包表記など)を検討しましょう。
5.3 fromkeys()
のまとめ
dict.fromkeys(keys_iterable, value)
は、指定したイテラブルの要素をキーとして、新しい辞書を作成するクラスメソッドです。全てのキーに同じ値を設定する場合に便利ですが、デフォルト値にミュータブルなオブジェクトを指定する際には、全てのキーが同じオブジェクトを参照してしまうという挙動に注意が必要です。
繰り返しになりますが、これは「新しい辞書を作る」メソッドであり、既存の辞書に要素を「追加」するメソッドとは少し異なりますが、複数の要素を持つ辞書を準備するという意味で関連性があるため紹介しました。
Section 6: 辞書への追加に関する注意点とトラブルシューティング
ここまで、辞書に要素を追加する様々な方法を見てきました。最後に、辞書への追加操作を行う上で知っておくべきいくつかの注意点と、発生しうるトラブルについて触れておきましょう。
6.1 重要な注意点:キーはハッシュ可能であること
Section 1とSection 2でも触れましたが、辞書のキーとして使えるのは、「ハッシュ可能(hashable)」なオブジェクトだけです。
ハッシュ可能とは、そのオブジェクトがハッシュ値を計算できること、そしてそのハッシュ値がオブジェクトの有効期間中に変更されない(イミュータブルである)こと、の2つの条件を満たすことを意味します。
-
ハッシュ可能なオブジェクトの例:
- 数値 (整数、浮動小数点数)
- 文字列 (string)
- タプル (tuple) – ただし、タプルに含まれるすべての要素がハッシュ可能である場合に限ります。
- None
- boolean (True, False)
- フローズンセット (frozenset)
-
ハッシュ可能でない(イミュータブルでないためハッシュ値が変わる可能性がある)オブジェクトの例:
- リスト (list)
- 辞書 (dict)
- セット (set)
なぜキーはハッシュ可能でなければならないのでしょうか?それは、辞書が内部でキーのハッシュ値を使って、対応する値が格納されている場所を高速に探し出す仕組みになっているからです。もしキーが変更可能(ミュータブル)だと、一度計算したハッシュ値が後から変わってしまう可能性があり、そうなると辞書は正しく要素を見つけられなくなってしまいます。
辞書のキーとしてハッシュ可能でないオブジェクトを使おうとすると、TypeError: unhashable type: '...'
というエラーが発生します。
“`python
ハッシュ可能でないオブジェクトをキーに使おうとする例
my_dict = {}
リストをキーにしようとする
try:
my_dict[[‘a’, ‘b’]] = 100
except TypeError as e:
print(f”エラーが発生しました: {e}”)
辞書をキーにしようとする
try:
my_dict[{‘x’: 1, ‘y’: 2}] = 200
except TypeError as e:
print(f”エラーが発生しました: {e}”)
ハッシュ可能なタプルはキーにできる
my_dict[(1, 2, 3)] = 300
print(f”タプルキーを追加後: {my_dict}”)
リストを含むタプルはハッシュ可能でないためキーにできない
try:
my_dict[(1, [2, 3])] = 400
except TypeError as e:
print(f”エラーが発生しました: {e}”)
“`
実行結果は以下のようになります。
エラーが発生しました: unhashable type: 'list'
エラーが発生しました: unhashable type: 'dict'
タプルキーを追加後: {(1, 2, 3): 300}
エラーが発生しました: unhashable type: 'list'
このように、キーとしてどのような型のオブジェクトを使えるかには制限があることを覚えておきましょう。通常よく使われる文字列や数値は問題ありませんが、リストや辞書などのコレクションをキーにしたい場合は、別のデータ構造(例えば、値を格納するリストや辞書全体を別の辞書の値として保持するなど)で代替することを検討する必要があります。
6.2 既存のキーに代入すると「追加」ではなく「更新」になることの再確認
これはSection 2で既に説明しましたが、辞書への要素追加で最も基本的な dictionary[キー] = 値
という構文は、指定したキーが既に存在する場合は追加ではなく更新(上書き)になります。意図せず値を変更してしまわないように注意が必要です。
“`python
既存の辞書
user_data = {‘id’: 101, ‘name’: ‘Alice’, ‘status’: ‘active’}
print(f”初期状態: {user_data}”)
存在しないキーを指定 → 追加
user_data[‘email’] = ‘[email protected]’
print(f”emailを追加後: {user_data}”)
存在するキーを指定 → 更新
user_data[‘status’] = ‘inactive’
print(f”statusを更新後: {user_data}”)
存在するキーを指定して別の値を代入 → 更新
user_data[‘name’] = ‘Alicia’
print(f”nameを更新後: {user_data}”)
“`
実行結果は以下のようになります。
初期状態: {'id': 101, 'name': 'Alice', 'status': 'active'}
emailを追加後: {'id': 101, 'name': 'Alice', 'status': 'active', 'email': '[email protected]'}
statusを更新後: {'id': 101, 'name': 'Alice', 'status': 'inactive', 'email': '[email protected]'}
nameを更新後: {'id': 101, 'name': 'Alicia', 'status': 'inactive', 'email': '[email protected]'}
もし「絶対に新しいキーでなければ追加しない」という厳密な制御をしたい場合は、事前に if key not in dictionary:
のようにキーの存在を確認してから代入するか、Section 4で解説した setdefault()
メソッドを利用することを検討しましょう。
6.3 ネストした辞書への追加
辞書の値として別の辞書を格納している場合(ネストした辞書)、その内側の辞書に要素を追加するには、キーを連続して指定していきます。
“`python
ネストした辞書
data = {
‘user1’: {‘name’: ‘Alice’, ‘info’: {‘age’: 30}},
‘user2’: {‘name’: ‘Bob’, ‘info’: {‘age’: 25}}
}
print(f”初期状態: {data}”)
user1の情報(内側の辞書)に新しい要素を追加
まずuser1の辞書にアクセスし、次にinfoの辞書にアクセスして新しいキーを指定
data[‘user1’][‘info’][‘city’] = ‘London’
print(f”user1のinfoにcityを追加後: {data}”)
user2の辞書に新しいキーを追加
user2の辞書に直接emailというキーを追加
data[‘user2’][‘email’] = ‘[email protected]’
print(f”user2にemailを追加後: {data}”)
“`
実行結果は以下のようになります。
初期状態: {'user1': {'name': 'Alice', 'info': {'age': 30}}, 'user2': {'name': 'Bob', 'info': {'age': 25}}}
user1のinfoにcityを追加後: {'user1': {'name': 'Alice', 'info': {'age': 30, 'city': 'London'}}, 'user2': {'name': 'Bob', 'info': {'age': 25}}}
user2にemailを追加後: {'user1': {'name': 'Alice', 'info': {'age': 30, 'city': 'London'}}, 'user2': {'name': 'Bob', 'info': {'age': 25}, 'email': '[email protected]'}}
このように、ネストした辞書の場合でも、dictionary[key1][key2]...[新しいキー] = 値
という形式で新しい要素を追加できます。ただし、途中のキー(この例の 'info'
や 'user2'
)が存在しない状態でさらに深くアクセスしようとすると KeyError
が発生するので注意が必要です。必要に応じて、途中のキーが存在するか確認するか、setdefault()
などを使って途中の辞書を先に作成してから要素を追加するなどの工夫が必要になります。
例えば、以下のように新しいユーザー情報を追加したいが、'info'
というネストされた辞書も最初から含めたい場合などです。
“`python
data = {} # 空の辞書から開始
新しいユーザー ‘user3’ を追加し、同時にその値として辞書をセット
data[‘user3’] = {‘name’: ‘Charlie’}
print(f”user3を追加後: {data}”)
user3の辞書の中にさらに’info’というキーで辞書をセット
data[‘user3’][‘info’] = {‘age’: 35}
print(f”user3のinfoを追加後: {data}”)
さらにその中の辞書に新しいキーを追加
data[‘user3’][‘info’][‘city’] = ‘Paris’
print(f”user3のinfoにcityを追加後: {data}”)
“`
実行結果は以下のようになります。
user3を追加後: {'user3': {'name': 'Charlie'}}
user3のinfoを追加後: {'user3': {'name': 'Charlie', 'info': {'age': 35}}}
user3のinfoにcityを追加後: {'user3': {'name': 'Charlie', 'info': {'age': 35, 'city': 'Paris'}}}
このように、階層的に辞書を作成しながら要素を追加していくことができます。
Section 7: 学んだことを実践!簡単な練習問題
ここまで、Pythonの辞書に要素を追加する様々な方法を学んできました。理解を深めるために、簡単な練習問題に挑戦してみましょう。
問題1: 基本的な代入による追加
空の辞書 my_profile
を作成し、以下のキーと値のペアを一つずつ追加してください。
'name'
:'山田太郎'
'age'
:28
'city'
:'東京都'
追加後の my_profile
辞書を表示してください。
“`python
問題1 ここから
空の辞書を作成
my_profile = {}
各要素を一つずつ追加するコードを記述
追加後の辞書を表示
print(my_profile)
問題1 ここまで
“`
問題2: update()
を使った複数追加
以下の初期状態の辞書 product_info
があります。
python
product_info = {'id': 'P001', 'name': 'Wireless Mouse'}
この辞書に、以下の情報をまとめて追加してください。追加・更新には update()
メソッドを使用してください。
- 価格:
2500
(キーは'price'
) - 在庫数:
50
(キーは'stock'
) - カテゴリ:
'Computer Accessories'
(キーは'category'
)
追加後の product_info
辞書を表示してください。update()
メソッドのどの形式を使うかは自由ですが、コードが簡潔になる方法を選んでみましょう。
“`python
問題2 ここから
初期状態の辞書
product_info = {‘id’: ‘P001’, ‘name’: ‘Wireless Mouse’}
update() メソッドを使って複数の要素を追加するコードを記述
追加後の辞書を表示
print(product_info)
問題2 ここまで
“`
問題3: setdefault()
を使った条件付き追加
以下の辞書 website_visits
は、ウェブサイトのページごとの訪問者数を記録しています。
python
website_visits = {'/home': 100, '/about': 50, '/contact': 30}
ここに新しいページ /services
への訪問者数を記録したいのですが、もし誤って既に存在するページ名を指定してしまった場合は、現在のカウントを上書きせずにそのままにしたいです。
setdefault()
メソッドを使って、以下の2つの操作を行ってください。
/services
という新しいページへの訪問者数0
を追加してください。(存在しないキー)/home
という既存のページへの訪問者数0
を追加しようとしてみてください。(存在するキー)
それぞれの操作の後、辞書がどうなっているかを確認し、setdefault()
メソッドの返り値を表示してください。
“`python
問題3 ここから
初期状態の辞書
website_visits = {‘/home’: 100, ‘/about’: 50, ‘/contact’: 30}
print(f”初期状態: {website_visits}”)
/services ページへの訪問者数を追加 (setdefaultを使用)
return_value_services = # ここにコードを記述
print(f”/services を setdefault した後: {website_visits}”)
print(f”返り値: {return_value_services}”)
print(“-” * 20)
/home ページへの訪問者数を追加しようとする (setdefaultを使用)
return_value_home = # ここにコードを記述
print(f”/home を setdefault した後: {website_visits}”)
print(f”返り値: {return_value_home}”)
問題3 ここまで
“`
練習問題 解答例と解説
問題1 解答例:
“`python
問題1 解答例
空の辞書を作成
my_profile = {}
各要素を一つずつ追加するコードを記述
my_profile[‘name’] = ‘山田太郎’
my_profile[‘age’] = 28
my_profile[‘city’] = ‘東京都’
追加後の辞書を表示
print(my_profile)
“`
解説:
最も基本的な dictionary[キー] = 値
の構文を使って、空の辞書に新しい要素を次々と追加しています。キーが存在しないので、すべて新しい要素として追加されます。
問題2 解答例:
“`python
問題2 解答例
初期状態の辞書
product_info = {‘id’: ‘P001’, ‘name’: ‘Wireless Mouse’}
update() メソッドを使って複数の要素を追加するコードを記述
方法1: 別の辞書として渡す
additional_info = {‘price’: 2500, ‘stock’: 50, ‘category’: ‘Computer Accessories’}
product_info.update(additional_info)
方法2: キーワード引数として渡す
product_info.update(price=2500, stock=50, category=’Computer Accessories’)
方法3: タプルのリストとして渡す
additional_list = [(‘price’, 2500), (‘stock’, 50), (‘category’, ‘Computer Accessories’)]
product_info.update(additional_list)
追加後の辞書を表示
print(product_info)
“`
解説:
update()
メソッドを使うことで、3つの要素をまとめて追加できます。解答例ではキーワード引数形式を使っていますが、別の辞書形式やタプルのリスト形式でも正解です。初期状態の辞書にはこれらのキーは存在しないため、すべて新しい要素として追加されます。
問題3 解答例:
“`python
問題3 解答例
初期状態の辞書
website_visits = {‘/home’: 100, ‘/about’: 50, ‘/contact’: 30}
print(f”初期状態: {website_visits}”)
/services ページへの訪問者数を追加 (setdefaultを使用)
キー ‘/services’ は存在しないため、’services’: 0 が追加され、0が返される
return_value_services = website_visits.setdefault(‘/services’, 0)
print(f”/services を setdefault した後: {website_visits}”)
print(f”返り値: {return_value_services}”)
print(“-” * 20)
/home ページへの訪問者数を追加しようとする (setdefaultを使用)
キー ‘/home’ は既に存在するため、辞書は変更されず、既存の値 100 が返される
return_value_home = website_visits.setdefault(‘/home’, 0)
print(f”/home を setdefault した後: {website_visits}”)
print(f”返り値: {return_value_home}”)
“`
解説:
/services
は辞書に存在しないキーなので、setdefault('/services', 0)
により '/services': 0
という要素が新しく追加され、返り値としてデフォルト値の 0
が得られます。
一方、/home
は辞書に既に存在するキーなので、setdefault('/home', 0)
を実行しても辞書は変更されず、返り値として既存の値 100
が得られます。このように、setdefault()
がキーの存在に応じて追加と値の取得を使い分けていることが分かります。
まとめ
この記事では、Pythonの辞書に新しい要素を追加する様々な方法について、初心者向けに徹底的に解説しました。
学んだ主要な方法は以下の3つです。
-
dictionary[新しいキー] = 値
- 最もシンプルで直感的な方法。
- 新しいキーの場合は追加、既存のキーの場合は更新となる。
- 要素を一つだけ追加する場合に適している。
-
dictionary.update(other_data)
- 別の辞書、キーと値のペアのイテラブル、またはキーワード引数を使って、複数の要素をまとめて追加・更新できる。
- 追加・更新したい要素が多い場合に効率的で、コードが簡潔になる。
- 引数の形式が複数ある(辞書、イテラブル、キーワード引数)。
-
dictionary.setdefault(key, default_value)
- 指定したキーが辞書に存在しない場合のみ、デフォルト値で新しい要素を追加し、その値を取得する。
- キーが存在する場合は、辞書は変更されず、既存の値が返される。
- 要素のカウントやグループ化など、条件付き追加と値の取得を同時に行いたい場合に便利。
これらの方法に加えて、複数のキーを持つ新しい辞書を効率的に作成する dict.fromkeys()
クラスメソッドや、辞書のキーとして使えるオブジェクトの制限(ハッシュ可能性)、ネストした辞書への追加方法といった応用的な内容にも触れました。
辞書はPythonプログラミングにおいて非常に頻繁に利用される、強力かつ柔軟なデータ構造です。特に、今回学んだ要素の追加・更新操作は、辞書を扱う上で最も基本的なスキルの一つです。
この記事で学んだ知識を、ぜひご自身のPythonプログラムで活用してみてください。実際にコードを書いて試行錯誤することが、理解を深める一番の近道です。
もしこの記事を読んで、辞書への要素追加についてさらに疑問が湧いたり、特定のケースでどうすれば良いか迷ったりした場合は、遠慮なく質問したり、Pythonの公式ドキュメントを参照したりしてみてください。
Pythonの辞書をマスターして、より効率的で分かりやすいプログラムを作成していきましょう!
最後までお読みいただき、ありがとうございました!