Pythonの辞書(dict)は、キーと値のペアを1つの要素として格納するコンテナです。リストと同じようにPythonでのプログラミングで使う機会は非常に多いです。
ここでは知っておくべき辞書の操作の解説を通じて、Pythonの辞書に対する理解を深められるように書かせて頂きました。
初心者の方は、ここで辞書に関しての重要ポイントは全て把握できるようになっています。それ以外の方は、あらためて辞書について再確認できるようになっています。
ぜひお役に立てて頂ければと思います。
1. 辞書の作成
早速、辞書の作成方法から解説します。作成方法がわかれば、辞書がどのようなデータを格納するコンテナなのかも理解できます。
なお、「Pythonの辞書(dict)の作成方法まとめ」では辞書の作成に特化して解説しているのであわせてご覧ください。
1.1. {} にキーと値のペアを入力して作成
辞書(dict)は、波括弧 {} の中に、キーと値のペアを入力して作成します。
{キー1: 値1, キー2:値2, キー3:値3}
リストやタプルは、値をインデックス番号で管理しますが、辞書はキーで管理します。そのため辞書にはインデックス番号は存在しません。
実際に辞書を作ってみたものが以下です。都市名をキーに、人口を値にしています。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
print(population)
上述のように辞書はキーで値を保持しているので、値を取得するには、次のように対応するキーを指定します。
print(population['東京'])
この値の取得については、後でまた解説します。
なお辞書のキーはイミュータブル(変更不可能)なオブジェクト(文字列、数値、タプル)のみ可能で、値はどのようなオブジェクトでも可能です。
辞書は値をキーで保持しているため、キーが意図せず変更されてしまったらバグだらけになってしまうからです。
また同一のキーが重複することはできません。
1.2. dict()関数で作成
辞書の作成では、dict()関数はとても便利です。
dict()関数での作成は大きく3パターンに分かれます。
まずは引数に「キー=値」と渡すパターンです。この方法では、キーや値が文字列の場合でもクオテーション( ‘ )で挟む必要はありません。
population = dict(東京=900, 横浜=370, 大阪=250, 名古屋=230, 福岡=150)
print(population)
要素がキーと値のペアになっているイテラブル(リストやタプルやセット)の場合は、直接dict()関数に渡すだけで辞書を作成してくれます。
list = [('東京', 900), ('横浜', 370), ('大阪', 250), ('名古屋', 230), ('福岡', 150)]
population = dict(list)
print(population)
zip()関数を使うと、2つのイテラブルの一方をキーに、他方を値にして辞書にすることもできます。
cities = ['東京', '横浜', '大阪', '名古屋', '福岡']
nums = [900, 370, 250, 230, 150]
population = dict(zip(cities, nums))
print(population)
1.3. 辞書の初期化|dict.fromkeys()関数
dict.fromkeys()関数を使うと、辞書のキーのみ作成することができます。
cities = dict.fromkeys(['東京', '横浜', '大阪', '名古屋', '福岡'])
print(cities)
第二引数で値の初期値を指定することもできます。
cities = dict.fromkeys(['東京', '横浜', '大阪', '名古屋', '福岡'], 0)
print(cities)
なお、この例では引数にリストを渡していますがイテラブル(リスト、タプル、セットなど)を渡しても構いません。
2. 辞書の値の取得
辞書の値はキーが保持しているのでキーを使って取得しますが、方法は2つあります。
- [] で取得する方法
- get()メソッドで取得する方法
それぞれ違いがあるので見ていきましょう。
2.1. [] でキーを指定して取得
まず、リストのスライスと同じように [] を使う方法です。リストでは [] にインデックス番号を書きますが、辞書ではキーを書きます。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
print(population['東京'])
print(population['大阪'])
それぞれのキーに対応する値が出力されていますね。
なお、この方法では存在しないキーを指定した時はエラーになります。
2.2. get()メソッドで取得
get()メソッドでも値を取得することができます。
引数にキーを渡します。
print(population.get('東京'))
print(population.get('京都')) # 存在しないキーではNone
[] による値の取得と違って、存在しないキーを指定した時はNoneを返します(=何も返さない)。または、第二引数で、存在しないキーを指定した場合の戻り値を書いておくことができます。
print(population.get('京都', '指定の都市はこの辞書にはありません。'))
このように、[] によるスライスとget()メソッドは違いがありますので、目的に応じて使い分けましょう。
この2つの方法の違いについては、「Pythonの辞書(dict)のキー・値の存在確認と取得方法」で、速度比較なども行ってより詳しく解説しているので、参考にしてみてください。
3. 辞書のキーと値の存在確認|in文
辞書を操作する際に、任意のキーや値が格納されているかどうかを確認したくなる時は多々あります。
そのような時にはin文を使います。
3.1. キーの存在確認
普通にin文を書くとキーを確認します。
指定のキーが存在すればTrue、存在しないならFalseを返します。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
print('東京' in population)
print('京都' in population)
3.2. 値の存在確認
値が存在するかどうかを調べるには、values()メソッドを実行した辞書を対象にin文を書きます。
print(900 in population.values())
print(10 in population.values())
values()メソッドについては、この後すぐに解説します。
4. for文で辞書の要素の取り出し
次に、for文で辞書の要素を全て取り出す方法を見てみましょう。
まず、for文は「Pythonのfor文による繰り返し処理(forループ)」で確認しておきましょう。また、for文による辞書の要素の取り出しについては、「Pythonの辞書(dict)のforループで要素を取り出す方法」でも解説していますので、そちらもご確認ください。
4.1. キーの取り出し|keys()メソッド
辞書のキーを全て取り出すには、keys()メソッドを実行した辞書をforループで回します。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
for k in population.keys():
print(k)
なおkeys()メソッドは、辞書からdict_keys型のイテラブルを作成するものです。
ppl_keys = population.keys()
print(ppl_keys)
実は、keys()メソッドを実行しなくても、辞書をそのままfor文で回せば、キーを取り出すことができます。
ただし、dict_keys型のオブジェクトは集合演算が可能など便利な点があるので覚えておきましょう。なお、集合演算については、「Pythonのsetの基本と操作まとめ」で解説しています。
4.2. 値の取り出し|values()メソッド
辞書の値を全て取り出すには、values()メソッドを実行した辞書をforループで回します。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
for v in population.values():
print(v)
values()メソッドは、辞書からdict_values型イテラブルを作成するものです。
ppl_values = population.values()
print(ppl_values)
dict_values型は集合演算はできません。集合演算における集合は、数学的に同じ値が2つあることはあり得ないからです。
dict_keys型で集合演算が可能なのは、辞書のキーは、同一のものが重複することはできないからです。
4.3. キーと値の取り出し|items()メソッド
辞書のキーと値を同時に取り出すには、辞書にitems()メソッドを実行した上でforループで回します。
キーと値の2つのデータがあるので、それぞれ別々の変数に入れて取り出すことができます。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
for k, v in population.items():
print(k, v)
変数を1つにすると、キーと値のペアをタプル型で取り出します。
for item in population.items():
print(item)
なお、items()メソッドは、dict_items型のイテラブルを作成します。
ppl_items = population.items()
print(ppl_items)
dict_items型のオブジェクトもキーによる集合演算が可能です。
5. 辞書の要素の追加
次に辞書に要素を追加する方法を確認しておきましょう。既に指定したキーが存在する場合はどうするかで、それぞれ方法が異なります。
なお「Pythonの辞書(dict)に要素を追加する方法まとめ」でも、より多くの例と解説を行っているので、あわせてご確認ください。
5.1. 要素の追加|setdefault()メソッド
setdefault()メソッドは、既存の辞書に新しいキーとそれに対応する値を追加するものです。
第一引数にキー、第二引数に値を指定します。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
population.setdefault('京都', 145)
print(population)
ただし、指定したキーが既に存在する場合は、何も行われません。
population.setdefault('東京', 100)
print(population)
5.2. 要素の追加と上書き|[キー] = 値
「辞書[キー] = 値」で、要素を追加もしくは上書きすることができます。
指定したキーが存在しない場合は、指定のキーと値を追加します。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
population['京都'] = 145
print(population)
setdefault()メソッドとの違いは、既に存在するキーを指定した場合は、その値を更新することです。
population['東京'] = 10
print(population)
5.3. 別の辞書の要素を追加と更新|update()メソッド
update()メソッドは、既存の辞書に別の辞書の要素を追加するものです。引数には追加したい辞書を指定します。
population1 = {'東京':900, '横浜':370, '大阪':250}
population2 = {'名古屋':230, '福岡':150}
population1.update(population2)
print(population1)
もし、重複するキーがある場合は、そのキーの値は上書きされます。
population1 = {'東京':900, '横浜':370, '大阪':250}
population2 = {'大阪':300, '名古屋':230, '福岡':150}
population1.update(population2)
print(population1)
6. 辞書の要素の削除
続いて、辞書の要素を削除する方法を見ていきましょう。
なお、これは「Pythonの辞書(dict)の要素を削除する方法まとめ」でも、詳しく解説しているのであわせてご確認ください。
6.1. キーを指定して要素を取り出して削除|pop()メソッド
pop()メソッドは、引数に指定したキーとその値を削除します。そして、メソッド実行時に、削除した要素の値を取り出して返します。
以下のコードでは、削除したキーに対応する値を変数poppedに代入して出力しています。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
popped = population.pop('福岡')
print(population)
print(popped)
6.2. ランダムに要素を取り出して削除|popitem()メソッド
popitem()メソッドは、辞書からランダムに要素を削除します。メソッド実行時に、削除した要素のキーと値を取り出してタプル型で返します。
以下のコードでは、削除したキーと値を変数poppedに代入して出力しています。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
popped = population.popitem()
print(population)
print(popped)
6.3. 複数の要素を一度に削除|del文
pop()メソッドやpopitem()メソッドは一度に一つずつ要素を削除します。一方で、del文は複数の要素を一度に削除できることが特徴です。
以下のコードのようにdel文の後に、削除する要素を[キー]で指定します。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
del population['福岡'], population['名古屋']
print(population)
もちろん削除する要素は1つでも構いません。
さらに、pop()メソッドやpopitem()メソッドと違って、del文を実行しても削除した要素は返ってきません。
6.4. 要素を全て削除して空にする|clear()メソッド
clear()メソッドは辞書の要素を全て削除して空にします。これは辞書を初期化したい時などに使います。
population = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
population.clear()
print(population)
7. 辞書のソート|sorted()関数
sorted()関数を使うと、辞書のキー、値、両方をソートすることができます。
なお、sorted()関数の戻り値はリスト型のため、辞書の要素はリストとしてソートされます。そもそも辞書はキーで値を保持するので、辞書型のままではソートができないからです。
ここでは、辞書に対するsorted()関数のもっとも基本的な使い方を解説しますが、「Pythonの辞書(dict)をソートする方法まとめ」ではさらに様々なソートの方法を解説していますので、ぜひ一緒にご覧ください。
7.1. キーをソートしてリスト化
キーをソートするには、sorted()関数に渡す時に、辞書にkeys()メソッドを実行します。
以下のコードでは、キーがひらがななので、あいうえお順でソートされてリスト化されています。
population = {'とうきょう':900, 'よこはま':370, 'おおさか':250, 'なごや':230, 'ふくおか':150}
cities_sorted = sorted(population.keys())
print(cities_sorted)
なお、keys()メソッドを実行しなくても、sorted()関数にそのまま辞書を渡す方法でも、キーがソートされた上でリスト化されます。そのため、必ず、keys()メソッドを使わなければいけないというわけではありません。
7.2. 値をソートしてリスト化
辞書の値をソートするには、辞書にvalues()メソッドを実行した上で、sorted()関数の引数に渡します。
以下のコードでは、辞書の値である数値が昇順でソートされてリスト化されていますね。
nums_sorted = sorted(population.values())
print(nums_sorted)
7.3. キーと値をソートしてリスト化
キーと値の両方をソートした上で取り出すには、辞書にitems()メソッドを実行した上で、sorted()関数に渡します。
この場合、ソートはキー基準で行われ、リストの中にタプル型で格納されます。
items_sorted = sorted(population.items())
print(items_sorted)
8. 辞書のコピー
最後に辞書をコピーする方法について解説しておきます。
辞書をコピーする時は、=演算子で、既存の辞書を別の変数に代入する方法は厳禁です。その理由は「Pythonの辞書(dict)をコピーする方法と注意点まとめ」で解説しているので、しっかりと確認しておきましょう。
8.1. 全部をコピー|copy()メソッド
辞書のキーと値の両方を全てコピーするには、copy()メソッドを使います。
population1 = {'東京':900, '横浜':370, '大阪':250, '名古屋':230, '福岡':150}
population2 = population1.copy()
print(population2)
8.2. キーだけコピー|dict.fromkeys()関数
キーだけをコピーした辞書を作るには、リスト作成のところでも出てきたdict.fromkeys()関数を使います。
第一引数にキーをコピーしたい辞書を渡し、第二引数で初期値を渡します。
keys_copied = dict.fromkeys(population1, 0)
print(keys_copied)
第二引数を指定しない場合、値はNoneになります。
9. まとめ
Pythonの辞書(dict)の基本的な操作について解説しました。辞書は、リストやタプルと異なってキーで値を保持するミュータブル(変更可能)なオブジェクトです。そのため、また違った形でデータを操作することができます。
まずは、ここで解説している辞書の操作をしっかりと使いこなせるようになっておきましょう。
コメント