【 Effective Python, 2nd Edition 】dictionary comprehension の使い道 投稿一覧へ戻る
Published 2020年6月11日7:01 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
リスト内包表記 (list comprehension) は使う場面も多いけれど、辞書内包表記 (dictionary comprehension) は使ったことがない、という方も多いのでは、
実際、使う場面はほぼほぼないかもしれません。
そこで、辞書内包表記を利用することでコード全体がスッキリする場面、をご紹介。
下記のようなデータ構造を利用しているとします。
ここで、ユーザー名とパスワードを入力してもらいログインする、といったような処理を考えます。
リスト内をループして該当するユーザーを探し出し、パスワードを照合して...
こんなときに前もってユーザー名を key とするディクショナリを作成しておくと
ループを使用する必要もなく、結果的にコード全体のネストが深くならずにスッキリします。
実際、使う場面はほぼほぼないかもしれません。
そこで、辞書内包表記を利用することでコード全体がスッキリする場面、をご紹介。
下記のようなデータ構造を利用しているとします。
users = [
(0, 'Nana', 'password'),
(1, 'Saki', '1234'),
(2, 'Yuka', '5678'),
(3, 'Hana', 'abcd')
]
(0, 'Nana', 'password'),
(1, 'Saki', '1234'),
(2, 'Yuka', '5678'),
(3, 'Hana', 'abcd')
]
ここで、ユーザー名とパスワードを入力してもらいログインする、といったような処理を考えます。
name_input = input('名前を入力してください: ')
password_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('ユーザー名がないです')
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('ユーザー名がないです')
try:
_, username, password = username_mapping[name_input] # 作成した辞書から値(=タプル)を取得し、アンパックすることでループが必要なくなります
if password_input == password:
print('あってます!')
else:
print('間違ってます')
except KeyError:
print('ユーザー名がないです')
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -