横浜国立大学理工学部建築都市環境系学科卒
一級鉄筋技能士
今回は配列と同じような、データの集まりであるdict(辞書)について習得していきます。
配列は、データを取得するときには、index(配列番号)からデータを取得します。
dictの辞書型は辞書と呼ばれる通り、索引からデータを取得します。
例えば、名前のデータが欲しい場合、索引として「名前」とすることでデータが取得できます。
詳しくみていきましょう。
本記事のサンプルコード
目次
dict(辞書)について
dictはキー(索引)からデータを取得することができます。
ですので、dictの宣言は次のように、キー: データをいくつも入れます。
キー: データはカンマ「,」で区切り、それらを波かっこで囲むだけです。
実際のコードは次のようになります。
1 2 3 4 5 6 7 8 |
data1 = 1 data2 = 2 data3 = 3 dict_a = { "key1": data1, "key2": data2, "key3": data3, } |
- キー値は数値でも動きますが、お勧めしません。1でも1.0でも動く。
- キー値は英語でわかりやすい名前が良い
- 最後のデータ(data3)の後ろのカンマはあってもなくても良い
dictはそのデータに名称があると扱いやすいデータで使う
dictはそのデータに名称があると扱いやすいデータで使います。
例えば、従業員の名前、ID、部門とかはdictの方が取り扱いやすいでしょう。
ID | 名前 | 部門 |
1234 | 鈴木 | 営業 |
1222 | 佐藤 | 総務 |
dict(辞書)の基本
では、dictを使っていきます。
dictデータをつくる
先ほどの従業員の表から作ってみましょう。
1 2 3 4 5 6 |
employee = { 'id': '1234', 'name': '鈴木', 'department': '営業', } print(employee) |
1 |
{'id': '1234', 'name': '鈴木', 'department': '営業'} |
みやすくするために、dictを作るときに改行していますが、1行でもOKです。
1 |
employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} |
データを取り出してみます。
employee[キー]で取り出せます。
1 |
print(emploee['id']) |
1 |
1234 |
一人分のデータしか作れていませんね。
二人分を作って配列に入れてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
employee1 = { 'id': '1234', 'name': '鈴木', 'department': '営業', } employee2 = { 'id': '1222', 'name': '佐藤', 'department': '総務', } employees = [employee1, employee2] print(employees) |
1 |
[{'id': '1234', 'name': '鈴木', 'department': '営業'}, {'id': '1222', 'name': '佐藤', 'department': '総務'}] |
組み込み関数dictを使って作る
「dict」という、組み込み関数を使っても作ることができます。
先程の、employeeと同じものを作ります。
1 2 3 4 |
# employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} # と同じ employee = dict(id=1234, name='鈴木', department='営業') print(employee) |
1 |
{'id': 1234, 'name': '鈴木', 'department': '営業'} |
同じデータが作れます。
こちらは、あまり見かけません。
どちらの記述ができても、???とならないように、両方覚えておきましょう。
キーと値を取り出すにはkey,value,itemメソッドを使う
dictからはキーと値を取り出すことができます。
取り出すには、keys、values、itemsを使います。
コードにしてみます。
1 2 3 4 5 6 |
# キー print(employee.keys()) # 値 print(employee.values()) # キーと値 print(employee.items()) |
1 2 3 |
dict_keys(['id', 'name', 'department']) dict_values([1234, '鈴木', '営業']) dict_items([('id', 1234), ('name', '鈴木'), ('department', '営業')]) |
それぞれ、型はlistではないので、listに変換することもできます。
1 2 3 4 5 |
# 型はlistではない print(type(employee.keys())) # listに変換 key_list = list(employee.keys()) print(key_list) |
1 2 |
class 'dict_keys'; ['id', 'name', 'department'] |
データの更新とデータの追加
更新、追加の方法は同じです。
dict名[キー値] = データ
コードにしてみます。
従業員の部門が変わって、役職がついたとします。
1 2 3 4 5 6 7 |
employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print(employee) # 部門変更 employee['department'] = '開発' # 役職追加 employee['position'] = '係長' print(employee) |
1 2 |
{'id': '1234', 'name': '鈴木', 'department': '営業'} {'id': '1234', 'name': '鈴木', 'department': '開発', 'position': '係長'} |
更新と追加の前後でデータが変わって、開発の係長になりました。
データを結合するメソッドは2種類
結合には2種類あります。
updateメソッド
一つ目はupdateメソッドを使う場合。
dict名.update(追加するdict名)
updateは、追加もできますが、重複するデータは上書きします。
重複がなく、データが追加される場合
1 2 3 4 |
employee = {'id': '1234', 'name': '鈴木'} add_data = {'department': '営業', 'position': '係長'} employee.update(add_data) print(employee) |
1 |
{'id': '1234', 'name': '鈴木', 'department': '営業', 'position': '係長'} |
employeeにadd_dataが追加されます。
departmentが重複している場合
1 2 3 4 5 |
# 重複がある場合 employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} add_data = {'department': '開発', 'position': '係長'} employee.update(add_data) print(employee) |
1 |
{'id': '1234', 'name': '鈴木', 'department': '開発', 'position': '係長'} |
重複分は上書きされます。
dictメソッド
2つ目は組み込み関数のdictを使う場合。
dictに**をつけて、データを与えます。
新しいdict名 = dict(**dict名, **dict名)
結合されたデータは新しいdict名で入れてあげます。
1 2 3 4 5 |
# dictを使う場合 data1 = {'id': '1234', 'name': '鈴木'} data2 = {'department': '営業', 'position': '係長'} employee = dict(**data1, **data2) print(employee) |
1 |
{'id': '1234', 'name': '鈴木', 'department': '営業', 'position': '係長'} |
この方法は、重複したキーがあるとエラーが出ます。
試してみてください。
削除するメソッドは4種類
削除する方法は4つあります。
メソッド / 文 | 機能 |
clear 若しくは {} | 全削除 |
pop(キー値) | 指定したキーの値を取り出す |
popitem() | 末尾のキー、データを取得 |
del dict名[キー] | 指定したデータを削除 |
同様にemployeeデータで見ていきます。
clear(全削除)メソッド
全削除は、データ読み直しや初期化で使います。
1 2 3 4 5 |
# 全削除 clear employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print("削除前", employee) employee.clear() print("削除後", employee) |
1 2 |
削除前 {'id': '1234', 'name': '鈴木', 'department': '営業'} 削除後 {} |
= {}を使う方法も紹介します。
1 2 3 4 5 |
# 全削除 {} employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print("削除前", employee) employee = {} print("削除後", employee) |
1 2 |
削除前 {'id': '1234', 'name': '鈴木', 'department': '営業'} 削除後 {} |
popメソッド
pop(キー)ではlistと同じで、データを取り出します。
取り出しなので、取り出した分が削除になります。
idのデータをpopしてみましょう。
1 2 3 4 5 6 |
# pop employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print("pop前", employee) d = employee.pop('id') print("popデータ", d) print("pop後", employee) |
1 2 3 |
pop前 {'id': '1234', 'name': '鈴木', 'department': '営業'} popデータ 1234 pop後 {'name': '鈴木', 'department': '営業'} |
popitemメソッド
popitemはpopと同じで取り出します。
popitemは末尾のデータを取り出します。
1 2 3 4 5 6 |
# popitem employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print("popitem前", employee) k, d = employee.popitem() print("popitemデータ", k, d) print("popitem後", employee) |
1 2 3 |
popitem前 {'id': '1234', 'name': '鈴木', 'department': '営業'} popitemデータ department 営業 popitem後 {'id': '1234', 'name': '鈴木'} |
del
del では指定したデータを削除することができます。
del dictデータ[キー]とすることで、削除ができます。
メソッドではないので、かっこ不要です。
del(dictデータ[キー])ではないのでご注意ください。
では、コードで確認します。
1 2 3 4 5 |
# del employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print("del前", employee) del employee['id'] print("del後", employee) |
1 2 |
del前 {'id': '1234', 'name': '鈴木', 'department': '営業'} del後 {'name': '鈴木', 'department': '営業'} |
dict(辞書)の応用
さて、ここからさらに使いこなせるようになっていきましょう。
for文で使う
辞書と繰り返し処理はよく使うので、しっかり習得していきましょう。
dictデータをそのまま使った場合は、key値が取り出せます。
取り出したキー値を使って、employeeからデータを取得しています。
1 2 3 |
employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} for key in employee: print(key, employee[key]) |
1 2 3 |
id 1234 name 鈴木 department 営業 |
items()を使った繰り返しでは、キー値とデータが取り出せます。
1 2 3 |
employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} for key, data in employee.items(): print(key, data) |
1 2 3 |
id 1234 name 鈴木 department 営業 |
入れ子構造のデータにする
基礎のところでは、下記のデータを1行ずつdictデータにして、配列に入れました。
ID | 名前 | 部門 |
1234 | 鈴木 | 営業 |
1222 | 佐藤 | 総務 |
これは、dictを入れ子にして作ることもできます。
idの値をキーにして、入れ子構造にしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
employee1 = { 'name': '鈴木', 'department': '営業', } employee2 = { 'name': '佐藤', 'department': '総務', } # idをキーにしてdictを入れ子構造 employee = { '1234': employee1, '1222': employee2 } print(employee) print('1234のデータ', employee['1234']) |
1 2 |
{'1234': {'name': '鈴木', 'department': '営業'}, '1222': {'name': '佐藤', 'department': '総務'}} 1234のデータ {'name': '鈴木', 'department': '営業'} |
この方法や配列にする方法、どれが正しいというのはありません。
わかりやすい方法を使用しましょう。
キーの有無はinを使って確認
キー値があるかどうかの確認はよく使います。
キー値がなければ、エラーとなる処理もあるためです。
キーの有無は、keysで取得できるkey値のデータに対して、inを使って確認します。
確認したいキー値 in dict.keys()
とします。同様に、valuesで値の存在確認もできます。
1 2 3 4 5 |
employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print('id有無', 'id' in employee.keys()) employee = {'id': '1234', 'name': '鈴木', 'department': '営業'} print('position有無', 'position' in employee.keys()) |
1 2 |
id有無 True position有無 False |
if文と一緒に組みわせて使うことが多いです。
並べ替えにはsortedを使う
dictの並べ替えは、キー値とデータがありますが、それぞれ並べ替えができます。
並び替えにはsortedを使います。
sortedにdictデータ.items()でキー値とデータを渡して、reverseで昇順(False)と降順(True)を指定します。
sorted(dictデータ.items(), reverse=True/False)
まず、キー値の並べ替えをしていきます。
並び替えがわかりやすいようにデータを({‘鈴木’: 90, ‘佐藤’: 70, ‘田中’: 80})に変更します。
1 2 3 4 5 6 7 8 9 |
# キーを昇順 employee = {'すずき': 90, 'さとう': 70, 'たなか': 80} employee_sorted = sorted(employee.items(), reverse=False) print('昇順', employee_sorted) # キーを降順 employee = {'すずき': 90, 'さとう': 70, 'たなか': 80} employee_sorted = sorted(employee.items(), reverse=True) print('降順', employee_sorted) |
1 2 |
昇順 [('さとう', 70), ('すずき', 90), ('たなか', 80)] 降順 [('たなか', 80), ('すずき', 90), ('さとう', 70)] |
次は、データの方を並び替えます。
まず、sortedに渡してる、employee.items()を確認します。
1 |
employee.items() |
1 |
dict_items([('すずき', 90), ('さとう', 70), ('たなか', 80)]) |
キー値,データが並んでおり、2列目のデータを並び替えたいということになります。
この2列目の指定は、無名関数(lambda)を使うとできます。
sortedの引数にkey=lambda e: e[列番号]を指定します。
sorted(dictデータ.items(), reverse=True/False, key=lambda e: e[列番号])
列番号は0から始まる番号です。今回は2列目なので列番号=1となります。
1 2 3 4 5 6 7 8 9 |
# キーを昇順 employee = {'すずき': 90, 'さとう': 70, 'たなか': 80} employee_sorted = sorted(employee.items(), reverse=False, key=lambda e: e[1]) print('昇順', employee_sorted) # キーを降順 employee = {'すずき': 90, 'さとう': 70, 'たなか': 80} employee_sorted = sorted(employee.items(), reverse=True, key=lambda e: e[1]) print('降順', employee_sorted) |
1 2 |
昇順 [('さとう', 70), ('たなか', 80), ('すずき', 90)] 降順 [('すずき', 90), ('たなか', 80), ('さとう', 70)] |
無名関数は、関数の一種です。
とりあえずは、この並べ替えも決まり文句のようなものですので、こういうものだと理解しておけばOKです。
まとめ
この記事ではdictの使い方の基礎と応用を紹介しました。
よく使いますので、しっかり理解しましょう。