質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1220閲覧

(python) if構文の条件分岐が思うように機能しない

hulot9

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/08/02 06:27

Python(3.7.0)とtkinterで単語帳を作っています。検索した言葉が単語帳に存在すればその意味を、存在しない場合はエラーを表示させたいと思っています。しかし、そのような意図でif構文を書いてみているのですが、エラー表示のコードを追加すると、辞書内に存在する言葉で検索してもエラー表示されるようになってしまい、どうしてそうなってしまうのかがわかりません。
以下が現在書いているコードです。どこをどのように書き換えば、エラー表示を正しい場合(検索した単語が単語帳内に存在しない場合)に表示できるようになるのでしょうか。ご回答お待ちしております。よろしくお願いします。

python

1# coding:utf-8 2import tkinter as tk 3import tkinter.messagebox as tmsg 4 5#ここでは空にしていますが、単語とその意味を紐付けしたディクショナリを作ってあります。 6word_list = {} 7 8def buttonClick(): 9 b = edit_box1.get() 10 11 key_list =[] 12 13 if b == "一覧": 14 for i in word_list: 15 key_list.append(i) 16 tmsg.showinfo("一覧", key_list) 17 else: 18 for j in word_list: 19 if b == j: 20 tmsg.showinfo("単語", word_list[j]) 21 else: 22 tmsg.showinfo("エラー", "Not Found") 23 break 24#このすぐ上のelse内にあるelseの、「tmsg.showinfo("エラー", "Not Found")」が思うように条件付けできません。 25 26root = tk.Tk() 27root.geometry("600x200") 28root.title("単語帳") 29 30edit_box1 = tk.Entry(width = 20, font=("Helvetica", 22)) 31edit_box1.place(x = 140, y = 70) 32 33button1 = tk.Button(root, text="検索", font=("Helvetica", 14), command=buttonClick) 34button1.place(x = 420, y = 80) 35 36root.mainloop()

該当のソースコード

python

1 if b == "一覧": 2 for i in word_list: 3 key_list.append(i) 4 tmsg.showinfo("一覧", key_list) 5 else: 6  for j in word_list: 7  if b == j: 8  tmsg.showinfo("単語", word_list[j]) 9  else: 10  tmsg.showinfo("エラー", "Not Found") 11  break

試したこと
else内にあるif構文のelse(エラー表示の指定部分)を「elif b != j:」にしてみたり、このelse部分を外のif構文のelseになるように書き換えてみたり、初めのelseを「elif b != "一覧"」にしてみたり、あるいはshowinfoではなくshowerrorにしても、いずれもエラー表示が優先されてしまいます。エラー表示を指定するコードを取っ払うと、検索した単語の意味がきちんと表示されるようになります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

LouiS0616さんの回答が、理想的なコードになっているので、エラーになる原因について少しだけ。

現在のif分では、word_listの要素を、一つずつ順番に判定しているのですが、
「最初に比較する要素」が検索語と一致しない限り、必ずエラーになってしまいますよね。

全ての要素を比較して、一致するものがなかった場合だけ、エラーにする必要があるので、
else側にエラー処理を書くのは、正しくないですね。

方法はいろいろあると思いますが、

例えば、一致した際の意味を保存する変数を、空白で初期化しておいて、
一致した場合、意味を代入するようにすれば、
for分を抜けたときに、その変数が空白なら、エラー処理をする。

ようなことができると思います。

ただ・・・
今回実施したいことについては、LouiS0616さんの回答が、シンプルで良いと思います。

投稿2018/08/02 07:41

Meganezaru

総合スコア715

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

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

LouiS0616

2018/08/02 07:51

各要素を巡回する必要があるなら、for-else文を使うと便利ですよ。 単語が見つかったときにbreakするようにすれば、breakがなくループを終えた = 要素が含まれない ときだけelse節が実行されますので。ここでエラーを吐けば良いです。
Meganezaru

2018/08/02 08:45 編集

for-else、知りませんでした! Post処理がシンプルに書けますね。 面白いですw でも、なんでelseなんでしょうね? 動きからすると、別のキーワードにした方が良い気がしました(^_^;)
hulot9

2018/08/02 10:16

>Meganezaruさん ご回答ありがとうございます!「エラーになる原因」について、LouisS0616さんの回答でもきちんと言及されていましたが、Meganezaruさんの噛み砕いた説明を読むことでようやく理解できまして、大変ありがたかったです。空白の変数を用意するという方法も、ここで言及してただいたおかげで、今後べつの機会に思い出しやすくなったような気がします。またご回答いただける機会がありましたら、よろしくお願いします。
hulot9

2018/08/02 10:29 編集

>LouiS0616さん こちらのコメントを拝見して、「こう書けばこうなると思ってたんだけどなあ…」と、わたしがつまづいていたのは「for-else文 をイメージしているはずのところに if-else文 で書いていた」ということにあったのだと気づきました!(ということは質問のタイトルが間違っていたということに…)。重ね重ねありがとうございます。
guest

0

単に辞書に在るか調べるだけなら次のように書けば良いです。

Python

1if b == "一覧": 2 # これで充分 3 tmsg.showinfo("一覧", list(word_list)) 4elif b in word_list: 5 tmsg.showinfo("単語", word_list[b]) 6else: 7 tmsg.showinfo("エラー", "Not Found")

元のコードだと、全要素を順に調べるのでほとんど必ずエラーが出ます。

投稿2018/08/02 06:31

編集2018/08/02 06:35
LouiS0616

総合スコア35658

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

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

hulot9

2018/08/02 10:13

ご回答ありがとうございます!自分が書こうとしているコードについて、他の方にも理想的と称されるような解を知ることができ、事実自分のコードに比べてずっとすっきりしたコードで、とても参考になりました。実はご回答いただいたコードにある「list()」と「in」の使い方を知らずにいたのでそれらを知る機会にもなり、質問してみて良かったです。またご回答いただける機会がありましたら、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問