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

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

ただいまの
回答率

88.63%

input()で入力された内容が、0~9の整数のいずれかであればリスト代入され、それ以外ならば無視してループを続けたい。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 469

gaigai

score 18

 前提・実現したいこと

初心者です。

私はint型で入力し、入力値が0~9の整数のいずれかであるか判別、条件を満たしていなけばスキップしてcontinueで続ける

具体的な例としては

1回目 入力値:4    代入
2回目 入力値:5.6  スキップ
3回目 入力値:aa  スキップ
4回目 入力値:6  代入
5回目 入力値:0  代入

結果[4, 6, 0]

という動きをイメージして下記のコードを書きました。

しかし、実際はstr型やfloat型が入力されるとエラーを吐き出します。

想定通りの挙動をさせるにはどうすればいいのでしょうか?

 該当のソースコード

sample_list =[]
while len(sample_list) != 3:
    sample_input = int(input('数値入力'))
    if sample_input in range(10):
        sample_list.append(sample_input)
    else:
        continue

 試したこと

調べた結果、isinstance()を使えばいいのかと思い、

while len(player_choice) != 3:
    player_input = int(input('数値入力'))
    if isinstance(player_input, int):
        if player_input in range(10):
            player_choice.append(player_input)
    else:
        continue

としましたが、結果は変わらずでした。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+2

上手くいかない原因

しかし、実際はstr型やfloat型が入力されるとエラーを吐き出します。

どんな値でもいきなり数値にキャストしようとしているからです。

>>> int(input())
spam
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'spam'

isinstance()を使えばいいのかと思い

文字列は、常に文字列型です。例え数字列として解釈できる場合も。

>>> isinstance('spam', str)
True
>>> isinstance('123', str)
True
>>> isinstance('123', int)
False

解決するには

結局、次のような段階を踏めば良いです。

  1. 文字列型からキャストしないまま、
  2. 数字列(特に0~9の1桁の数字)であることを判定

いろいろな方法が考えられますが、一番お手軽なのはこんな方法でしょうか。

sample_input = input('数値入力')
if sample_input in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
    sample_list.append(int(sample_input))

なお、数字列のリストは次のように生成すると楽です。

>>> list('0123456789')
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

おまけ

こんな方法でも良いでしょう。

>>> src = 'spam'
>>> len(src) == 1 and src.isdigit()
False
>>>
>>> src = '123'
>>> len(src) == 1 and src.isdigit()
False
>>>
>>> src = '1'
>>> len(src) == 1 and src.isdigit()
True

関数化するのもアリです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/15 23:58 編集

    申し訳ありません。

    私の質問の仕方が悪く、質問内容が上手く伝わっていませんでした。
    訂正いたしましたので目を通していただければ幸いです。

    ただ、教えてくださったリストの作り方は知らなかったので勉強になりました。
    ありがとうございます。

    キャンセル

  • 2018/10/16 00:22

    訂正後の質問を見返しましたが、『長さ1の数字を判別したい』という主目的に変化は無いように思います。
    私の回答の方法が活用できるはずです。

    キャンセル

  • 2018/10/16 08:41

    たしかに!

    変数に代入した数字が
    ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    を満たしているかで判別しているのだから、応用できました。

    細かい動きをしっかり見て考えてみます。

    キャンセル

checkベストアンサー

+1

read_num.py

sample_list = []

while len(sample_list) != 3:
    str = input('数値入力')
    if len(str) == 1 and "0" <= str and str <= "9":
        sample_list.append(int(str))
    else:
        print("エラー(0 .. 9 の半角数字を入力してください)")

print(sample_list)

実行例
イメージ説明

全角 1 や SPACEを含んだ数字も入力から弾いています。

参考情報

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/16 08:28 編集

    勝手に数字の比較はstr型ではできないと思い込んでいました。
    str型で判別できるのであればこの書き方が一番シンプルで理解しやすい回答でした。
    ありがとうございます。

    ただ、そうなると疑問がもう一つ・・・・・・
    数字をstr型に変換しても数字としての定義(正しい言葉なのか疑問ですが)は残っているということでしょうか?


    イメージとしては

    int型は数字を数字として扱うもの
    str型は数字を文字として扱うため、数字の機能は無い。つまり、比較などできない

    と理解していました。


    しかし、実際は異なるようです。このことに関しては、何か助言をいただけますでしょうか。
    それとも、こみいった話になるので現状としてはそういうものとして理解しているほうがよろしいでしょうか?

    キャンセル

  • 2018/10/16 08:32

    辞書順があるように文字は比較できるので。

    キャンセル

  • 2018/10/16 08:36

    なるほど。
    各文字に順番が割り当てられていて、それを利用して比較するような形ですね。

    理解できました!ありがとうございます。

    キャンセル

+1

正規表現を使うと以下で判定できます。

import re
r = re.compile(r'^[0-9]$') # 行頭~行末まで0~9のいずれか一文字
l = []
while True:
    sample_input = input('数値入力')
    if len(sample_input) == 0: # 未入力(改行のみ)を終了条件としました
        print('end')
        break
    print(sample_input)
    if r.match(sample_input):
        print('match')
        l.append(sample_input)
    else:
        print('skip')
print(l) # 文字列のリストとして出力

 追記

が0~9の整数のいずれかであるか判別

一桁の数値の判別ですかね。ちょっと誤解してました。すみません。以下では012もマッチします。
題意に合わせ修正しました。プログラムの終了条件は改行のみ入力としました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/16 08:31

    回答ありがとうございます。
    正規表現についてはまだ未着手であったので、この回答を参考に勉強してみます。

    キャンセル

0

try~exceptで。
https://wandbox.org/permlink/0RAjUMlWYMPk3f8l

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/17 10:20

    回答ありがとうございます。

    try~exceptは初見でしたので、いただいたコードを参考に色々ためしてみます。

    キャンセル

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

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

関連した質問

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

  • トップ
  • Python 3.xに関する質問
  • input()で入力された内容が、0~9の整数のいずれかであればリスト代入され、それ以外ならば無視してループを続けたい。