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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

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

Q&A

解決済

7回答

1945閲覧

if文が全く通らなかったとき一度だけprint("Error")を呼び出したい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

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

0グッド

1クリップ

投稿2017/11/01 01:43

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ページで確認できます。

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

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

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

guest

回答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

quickquip

総合スコア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
toritoritorina

総合スコア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
umyu

総合スコア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

Lhankor_Mhy

総合スコア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
nitoage

総合スコア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

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

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

quickquip

2017/11/01 02:15

inp_id = 300 で Error を出力する仕様ですか?
masaya_ohashi

2017/11/01 02:15

よく見たらそれだと正しく動作しませんよ。
退会済みユーザー

退会済みユーザー

2017/11/01 02:18

そうですね^^;
退会済みユーザー

退会済みユーザー

2017/11/01 02:22

スクリプトを修正すると、masaya_ohashi さんのとほぼ同じになりますね。 追加するとしたら、find = True の下で、break いれて抜ける感じですかね。
guest

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

https://paiza.io/projects/MAfAL4TcAXipK0S0xQYPPA

投稿2017/11/01 02:12

masaya_ohashi

総合スコア9206

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

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

masaya_ohashi

2017/11/01 02:13

あ、len(s)というのがよくわからなかったので勝手にlen(arr)に書き換えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問