リスト内包表記 (list comprehension) は使う場面も多いけれど、辞書内包表記 (dictionary comprehension) は使ったことがない、という方も多いのでは、
実際、使う場面はほぼほぼないかもしれません。
そこで、辞書内包表記を利用することでコード全体がスッキリする場面、をご紹介。
下記のようなデータ構造を利用しているとします。
users = [
(0, 'Nana', 'password'),
(1, 'Saki', '1234'),
(2, 'Yuka', '5678'),
(3, 'Hana', 'abcd')
]
ここで、ユーザー名とパスワードを入力してもらいログインする、といったような処理を考えます。
name_input = input('名前を入力してください: ')
password_input = input('パスワードを入力してください: ')
リスト内をループして該当するユーザーを探し出し、パスワードを照合して...
for user in users:
if name_input == user[1]:
if password_input == user[2]:
print('あってます!')
else:
print('間違ってます')
break
else:
print('ユーザー名がないです')
こんなときに前もってユーザー名を key とするディクショナリを作成しておくと
ループを使用する必要もなく、結果的にコード全体のネストが深くならずにスッキリします。
username_mapping = {user[1]: user for user in users} # これが噂の dictionary comprehension (辞書内包表記) です
try:
_, username, password = username_mapping[name_input] # 作成した辞書から値(=タプル)を取得し、アンパックすることでループが必要なくなります
if password_input == password:
print('あってます!')
else:
print('間違ってます')
except KeyError:
print('ユーザー名がないです')