
【 Effective Python, 2nd Edition 】dictionary comprehension の使い道 投稿一覧へ戻る
Published 2020年6月11日7:01 by T.Tsuyoshi
リスト内包表記 (list comprehension) は使う場面も多いけれど、辞書内包表記 (dictionary comprehension) は使ったことがない、という方も多いのでは、
実際、使う場面はほぼほぼないかもしれません。
そこで、辞書内包表記を利用することでコード全体がスッキリする場面、をご紹介。
下記のようなデータ構造を利用しているとします。
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('ユーザー名がないです')
こちらの投稿にも興味があるかもしれません...
- 【 Effective Python, 2nd Edition 】組み込みタイプ ( built-in types ) を利用していてネストが深くなってきたらクラス ( class ) を作成する頃合いです、の巻
- 【 Effective Python, 2nd Edition 】入力元のデータサイズが大きい場合は、リスト内包表記 ( list comprehension ) ではなくジェネレータ式 ( generator expression ) の利用を検討しよう!
- 【 Effective Python, 2nd Edition 】assignment expression (walrus operator, :=) を利用して内包表記におけるサブ書式の重複を回避しよう!
- 【 Effective Python, 2nd Edition 】内包表記に含める for 文や if 文の数は2つ位までに抑えておかないと読解性が極端に悪くなりますよ、という話
0 comments
コメントはまだありません。
コメントを追加する(不適切と思われるコメントは削除する場合があります)