🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1867閲覧

辞書のキーにない例外処理の方法

erumoa400

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/30 08:12

ユーザーの入力が辞書のキーにない場合の例外処理の書き方が分かりません。

python

1food = {"マグロ": 120, "たまご": 100, "大トロ": 200} 2 3def main() 4 user_food = input("食べたいネタを入力してください: ") 5 6 """sample 1""" 7 try: 8 user_food == food.keys() 9 except KeyError: 10 print("そのネタはありません") 11 12 """sample 2""" 13 try: 14 user_food in food.keys() 15 except KeyError: 16 print("そのネタはありません")

上記のサンプルだとtry/exceptがうまく作動しないのですが、どのように書けばいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

上記のサンプルだとtry/exceptがうまく作動しないのですが、

まず、質問文のコードでは、try/exceptの動作以前に文法エラーで動きませんし、それを修正してもmainを呼び出していないので思うような結果は得られません。

  • def main()の後に:を追加。
  • 最終行にmain()を追加。

sample1のuser_food == food.keys()は、user_foodの値が文字列で、food.keys()の返り値がリストに似たオブジェクト(dict_keys)なので、常にFalseになりますが、KeyErrorは発生しません。よって、こちらのprintが実行されることはありません。

sample2のuser_food in food.keys()は、food.keys()の返り値のリスト(に似たオブジェクトdict_keys)の中にuser_foodの値の文字列が要素として含まれていればTrue、含まれていなければFalseになります。KeyErrorは発生しません。よって、こちらのprintが実行されることはありません。

user_food in food.keys()を使うとしたら、例えば以下のようにします。

Python

1 if user_food in food.keys(): 2 print(f"{user_food}{food[user_food]}円になります。") 3 else: 4 print("そのネタはありません")

さて、どうしてもKeyErrorを発生させてtry/exceptを使いたいのであれば、たとえばfood[user_food]を(上記のようなチェックをすることなく)いきなり使えば同じ処理ができます。

Python

1 try: 2 print(f"{user_food}{food[user_food]}円になります。") 3 except KeyError: 4 print("そのネタはありません")

投稿2021/01/30 08:38

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erumoa400

2021/02/06 01:16

辞書のキーの値は文字列では無いんですね... とても分かりやすい説明で助かりました! ありがとうございます
Daregada

2021/02/06 01:30

> 辞書のキーの値は文字列では無いんですね... いいえ。 辞書のキー(ひとつひとつのキーとなる値)は文字列です。 foot.keys()で得られる値はキーではなく、「複数のキーがまとめられたデータ」です。 あなたはこの2つを区別できてきなかったので、おかしなコードを書くことになりました。 「複数のキーがまとめられたデータ」はdict_keysオブジェクトという種類のデータです。 このdict_keysオブジェクトはリストのように扱うことができます。 具体的には、for文でinを使って要素(ひとつひとつのキー)を取り出しつつ繰り返し処理を行なったり、if文でinを使って、ある文字列が要素として含まれているかを調べることができます。
erumoa400

2021/02/06 01:38

なるほど、勘違いをしていました... キー自体は文字列でも、.keys()で得られる値は文字列ではなくなると言うことですね 分かりやすくて本当にありがたいです
guest

0

こういう感じで書いてください。

python

1try: 2 print(f'{user_food}{food[user_food]}円です') 3except KeyError: 4 print("そのネタはありません")

投稿2021/01/30 08:33

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erumoa400

2021/02/06 01:17

f-stringを知らなかったのでこの機会に知れてよかったです 回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問