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

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

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

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

Q&A

解決済

4回答

1037閲覧

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

kaiura

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2018/10/15 14:37

編集2018/10/15 14:54

前提・実現したいこと

初心者です。

私は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

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

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

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

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

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

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

guest

回答4

0

上手くいかない原因

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

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

Python

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

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

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

Python

1>>> isinstance('spam', str) 2True 3>>> isinstance('123', str) 4True 5>>> isinstance('123', int) 6False

解決するには

結局、次のような段階を踏めば良いです。
0. 文字列型からキャストしないまま、
0. 数字列(特に0~9の1桁の数字)であることを判定

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

Python

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

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

Python

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

おまけ

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

Python

1>>> src = 'spam' 2>>> len(src) == 1 and src.isdigit() 3False 4>>> 5>>> src = '123' 6>>> len(src) == 1 and src.isdigit() 7False 8>>> 9>>> src = '1' 10>>> len(src) == 1 and src.isdigit() 11True

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

投稿2018/10/15 14:41

編集2018/10/15 14:52
LouiS0616

総合スコア35658

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

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

kaiura

2018/10/15 14:59 編集

申し訳ありません。 私の質問の仕方が悪く、質問内容が上手く伝わっていませんでした。 訂正いたしましたので目を通していただければ幸いです。 ただ、教えてくださったリストの作り方は知らなかったので勉強になりました。 ありがとうございます。
LouiS0616

2018/10/15 15:22

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

2018/10/15 23:41

たしかに! 変数に代入した数字が ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] を満たしているかで判別しているのだから、応用できました。 細かい動きをしっかり見て考えてみます。
guest

0

ベストアンサー

read_num.py

python3

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

実行例
イメージ説明

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

参考情報

  • 文字列が数字であることを判別する(isdigit, isdecimal, isnumeric)

https://hibiki-press.tech/learn_prog/python/isdigit/899

投稿2018/10/15 15:24

katoy

総合スコア22324

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

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

kaiura

2018/10/15 23:34 編集

勝手に数字の比較はstr型ではできないと思い込んでいました。 str型で判別できるのであればこの書き方が一番シンプルで理解しやすい回答でした。 ありがとうございます。 ただ、そうなると疑問がもう一つ・・・・・・ 数字をstr型に変換しても数字としての定義(正しい言葉なのか疑問ですが)は残っているということでしょうか? イメージとしては int型は数字を数字として扱うもの str型は数字を文字として扱うため、数字の機能は無い。つまり、比較などできない と理解していました。 しかし、実際は異なるようです。このことに関しては、何か助言をいただけますでしょうか。 それとも、こみいった話になるので現状としてはそういうものとして理解しているほうがよろしいでしょうか?
mkgrei

2018/10/15 23:32

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

2018/10/15 23:36

なるほど。 各文字に順番が割り当てられていて、それを利用して比較するような形ですね。 理解できました!ありがとうございます。
guest

0

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

Python

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

追記

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

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

投稿2018/10/15 15:05

編集2018/10/15 15:20
can110

総合スコア38234

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

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

kaiura

2018/10/15 23:31

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

0

投稿2018/10/15 23:31

mkgrei

総合スコア8560

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

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

kaiura

2018/10/17 01:20

回答ありがとうございます。 try~exceptは初見でしたので、いただいたコードを参考に色々ためしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問