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

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

ただいまの
回答率

90.76%

  • Python

    6915questions

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

  • Django

    917questions

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

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

解決済

回答 7

投稿

  • 評価
  • クリップ 1
  • VIEW 559
退会済みユーザー

退会済みユーザー

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文の後に挟んだらいいのかと思いましたが、それだと期待したシステムが作れず。。。どう直せばよいのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

+4

全部ループする必要はなくて、break文と、for文のelse節を使うのがいいでしょう。

http://docs.python.jp/3/reference/compound_stmts.html#the-for-statement

    for i in range(len(s) // 2):
        if inp_id == arr[i][0]:
            print("ok")
            break
    else:
        print("Error")

しかし、変数sと、arrの関係が不明です。

ループにarr変数を使わないことは、よい習慣ではありません。もし意味的に以下のようにしてよいなら、この方がいいと思います。

    arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
    inp_id = 100
    for i, j in arr:
        if inp_id == i:
            print("ok")
            break
    else:
        print("Error")

あと、これはおおむね余談ですが、いずれかが真ならという意味になるany関数を使うのが読み下しやすいと思いますよ。

    arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
    inp_id = 100
    if any(inp_id == i for i, j in arr):
        print("ok")
    else:
        print("Error")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

この手の処理は、見つかったら何かしらの変数にTrueを入れておき、後でその値で条件分岐させてやれば良いです。どれかと一致すれば良いとのことでなので、見つかったらさっさとbreakでループを抜けます。

arr = [
    [100,2], [300,3], [500,4],
    [800,5], [200,6]
]
inp_id = 700
found = False

for i in range(len(arr)):
    if inp_id == arr[i][0]:
        found = True
        break

if found:
    print('OK')
else:
    print('Error')

これはfor〜else構文でも書くことができます。このfor〜elseのelseブロックには、for文内でbreakがない場合のみ入ります。
一応紹介しますが、書籍によっては「わかりにくいかもしれない(入門Python3)」とか「わかりづらいので使うのは辞めるべき(Effective Python)」と書かれので、使わないほうが無難かもしれません。

arr = [
    [100,2], [300,3], [500,4],
    [800,5], [200,6]
]
inp_id = 100
found = False

for i in range(len(arr)):
    if inp_id == arr[i][0]:
        print('OK')
        break
else:
    print('Error')  # breakがなければ入る

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

見つかればok、見つからなければErrorということは、「見つかったか」という結果さえわかれば処理を切り分けることができます。ですので、「見つかった」というフラグを用意しておいて、forでは「見つかったかどうか」だけを調べ、その後「見つかっているか見つかっていないか」で出力すればよいです。

arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
inp_id = 100
find = False
for i in range(int(len(arr))):
    if inp_id == arr[i][0]:
        find = True

if find:
    print("ok")
else:
    print('Error');

https://paiza.io/projects/MAfAL4TcAXipK0S0xQYPPA

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 11:13

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

    キャンセル

0

間違ってます。コメントいただいたとおり、仕様を満たしていません^^;

こんな感じですかね?

arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
inp_id = 100
for i in range(int(len(arr))):
    if inp_id == arr[i][0]:
        print("ok")
        break
    else:
        print("Error")
        break

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 11:15

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

    キャンセル

  • 2017/11/01 11:15

    よく見たらそれだと正しく動作しませんよ。

    キャンセル

  • 2017/11/01 11:18

    そうですね^^;

    キャンセル

  • 2017/11/01 11:22

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

    キャンセル

0

いくつか実装パターンを記載してみました。
私的な意見ですが配列やリストの比較はinなどで行う方が好きだったりします。

##############
#第1案 結果をため込んで最後に評価
arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
inp_id = 100
check=[]
for i in range(int(len(s)/2)):
    check.append(arr[i][0])

print("ok" if inp_id in check else "Error")

############################
#第2案 直接 配列を評価 要numpy
import numpy as np
arr = np.array([[100,2],[300,3],[500,4],[800,5],[200,6]])
inp_id = 100
print("ok" if inp_id in arr[:,0] else "Error")

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

    arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
    inp_id = 100
    flag = False
    for i in range(int(len(s)/2)):
        if inp_id == arr[i][0]:
            flag = True
    if flag:
        print("ok")
    else:
        print("Error")


本当は配列内包使った方が分かりやすいと思いますが、いろいろ他にも処理しているようなので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

# -*- coding: utf-8 -*-
def search(key, arr):
    return list(filter(lambda n: n[0] == key, arr))


def main():
    arr = [[100, 2], [300, 3], [500, 4], [800, 5], [200, 6]]
    inp_id = 100
    ret = search(inp_id, arr)
    print(ret)
    if len(ret) > 0:
        print("ok")
    else:
        print("Error")


if __name__ == '__main__':
    main()


filterを使ったコードです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6915questions

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

  • Django

    917questions

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