if文が全く通らなかったとき一度だけprint("Error")を呼び出したいです。
inp_idとarr二次元配列の0番目の要素(100・300・500・・・)のうちのどれかと一致するならokを、しないならErrorを表示させたいです。
arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] inp_id = 100 for i in range(int(len(s)/2)): if inp_id == arr[i][0]: print("ok") else: print("Error")
とコードを書きました。今のコードなら、最初okが表示され、その次に4回Errorが表示されます。期待する動きは、ok もしくは Errorが一回だけ表示されるというものです。
inp_id = 300
とするならokが一回だけ、
inp_id = 700
とするならErrorが一回だけ表示されるというシステムを作りたいです。
exitをif-else文の後に挟んだらいいのかと思いましたが、それだと期待したシステムが作れず。。。どう直せばよいのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
全部ループする必要はなくて、break文と、for文のelse節を使うのがいいでしょう。
http://docs.python.jp/3/reference/compound_stmts.html#the-for-statement
python
1 for i in range(len(s) // 2): 2 if inp_id == arr[i][0]: 3 print("ok") 4 break 5 else: 6 print("Error") 7
しかし、変数s
と、arr
の関係が不明です。
ループにarr
変数を使わないことは、よい習慣ではありません。もし意味的に以下のようにしてよいなら、この方がいいと思います。
python
1 arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] 2 inp_id = 100 3 for i, j in arr: 4 if inp_id == i: 5 print("ok") 6 break 7 else: 8 print("Error")
あと、これはおおむね余談ですが、いずれかが真ならという意味になるany関数を使うのが読み下しやすいと思いますよ。
pyhthon
1 arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] 2 inp_id = 100 3 if any(inp_id == i for i, j in arr): 4 print("ok") 5 else: 6 print("Error")
投稿2017/11/01 02:13
総合スコア11029
0
ベストアンサー
この手の処理は、見つかったら何かしらの変数にTrueを入れておき、後でその値で条件分岐させてやれば良いです。どれかと一致すれば良いとのことでなので、見つかったらさっさとbreakでループを抜けます。
python
1arr = [ 2 [100,2], [300,3], [500,4], 3 [800,5], [200,6] 4] 5inp_id = 700 6found = False 7 8for i in range(len(arr)): 9 if inp_id == arr[i][0]: 10 found = True 11 break 12 13if found: 14 print('OK') 15else: 16 print('Error')
これはfor〜else構文でも書くことができます。このfor〜elseのelseブロックには、for文内でbreakがない場合のみ入ります。
一応紹介しますが、書籍によっては「わかりにくいかもしれない(入門Python3)」とか「わかりづらいので使うのは辞めるべき(Effective Python)」と書かれので、使わないほうが無難かもしれません。
python
1arr = [ 2 [100,2], [300,3], [500,4], 3 [800,5], [200,6] 4] 5inp_id = 100 6found = False 7 8for i in range(len(arr)): 9 if inp_id == arr[i][0]: 10 print('OK') 11 break 12else: 13 print('Error') # breakがなければ入る 14
投稿2017/11/01 02:18
編集2017/11/01 02:28総合スコア972
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Python
1# -*- coding: utf-8 -*- 2def search(key, arr): 3 return list(filter(lambda n: n[0] == key, arr)) 4 5 6def main(): 7 arr = [[100, 2], [300, 3], [500, 4], [800, 5], [200, 6]] 8 inp_id = 100 9 ret = search(inp_id, arr) 10 print(ret) 11 if len(ret) > 0: 12 print("ok") 13 else: 14 print("Error") 15 16 17if __name__ == '__main__': 18 main()
filterを使ったコードです。
投稿2017/11/02 00:46
編集2017/11/02 00:48総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
python
1 arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] 2 inp_id = 100 3 flag = False 4 for i in range(int(len(s)/2)): 5 if inp_id == arr[i][0]: 6 flag = True 7 if flag: 8 print("ok") 9 else: 10 print("Error")
本当は配列内包使った方が分かりやすいと思いますが、いろいろ他にも処理しているようなので。
投稿2017/11/01 02:26
総合スコア35869
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
いくつか実装パターンを記載してみました。
私的な意見ですが配列やリストの比較はinなどで行う方が好きだったりします。
python
1############## 2#第1案 結果をため込んで最後に評価 3arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] 4inp_id = 100 5check=[] 6for i in range(int(len(s)/2)): 7 check.append(arr[i][0]) 8 9print("ok" if inp_id in check else "Error") 10 11############################ 12#第2案 直接 配列を評価 要numpy 13import numpy as np 14arr = np.array([[100,2],[300,3],[500,4],[800,5],[200,6]]) 15inp_id = 100 16print("ok" if inp_id in arr[:,0] else "Error")
投稿2017/11/01 02:17
編集2017/11/01 02:21総合スコア98
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
間違ってます。コメントいただいたとおり、仕様を満たしていません^^;
こんな感じですかね?
python
1arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] 2inp_id = 100 3for i in range(int(len(arr))): 4 if inp_id == arr[i][0]: 5 print("ok") 6 break 7 else: 8 print("Error") 9 break
投稿2017/11/01 02:13
編集2017/11/01 02:29退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/01 02:15
退会済みユーザー
2017/11/01 02:18
退会済みユーザー
2017/11/01 02:22
0
見つかればok、見つからなければErrorということは、「見つかったか」という結果さえわかれば処理を切り分けることができます。ですので、「見つかった」というフラグを用意しておいて、forでは「見つかったかどうか」だけを調べ、その後「見つかっているか見つかっていないか」で出力すればよいです。
Python
1arr = [[100,2],[300,3],[500,4],[800,5],[200,6]] 2inp_id = 100 3find = False 4for i in range(int(len(arr))): 5 if inp_id == arr[i][0]: 6 find = True 7 8if find: 9 print("ok") 10else: 11 print('Error'); 12
投稿2017/11/01 02:12
総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。