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

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

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

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

Q&A

解決済

2回答

502閲覧

inputで空白か数値のどちらかを入力したいのと、classで作った辞書データの修正がしたいです。

123123123

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2018/10/30 04:09

生徒個別の情報を登録し、今後活用するために、class Dataを作りました。

質問1:
選択教科2と3は、空白か数値をinputしたいです。
int(input())で入力をしようと思っていたのですが、空白はエラーになります。
try:
int(input())
except ValueError
で試しましたが、だめでした。どうすれば、空白か数値のどちらかをinputするようにできますか。

質問2:
入力ミスをしたときや、選択教科が変わったときに、あとでデータを修正したいです。
例えば、出席番号を入れて、option_1を変更するには、どのようなコードを足せばよいでしょうか。

class Data: def __init__(self): self.all_items = [] def assign(self, number, last_name, first_name, option_1, option_2, option_3,): self.number = number self.last_name = last_name self.first_name = first_name self.option_1 = option_1 self.option_2 = option_2 self.option_3 = option_3 def add_data(self): self.all_items.append({'number' : self.number, 'last_name':self.last_name, 'first_name' : self.first_name, 'option_1' : self.option_1, 'option_2' : self.option_2, 'option_3': self.option_3}) def show_all(self): for i in self.all_items: print(i) if __name__ == "__main__": print('生徒の数を教えてください。') num_1 = int(input()) jikken = Data() for i in range(num_1): print('出席番号',i+1,'のデータを入力') data1 = i+1 data2 = input('苗字を入力') data3 = input('名前を入力') data4 = int(input('選択教科1を入力')) data5 = int(input('選択教科2を入力')) data6 = int(input('選択教科3を入力')) jikken.assign(data1, data2, data3, data4, data5, data6,) jikken.add_data() jikken.show_all()

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問1

「空文字列」か「整数」を入れたいのなら、こんな感じですかね。

python

1x = input() 2if x: # 空文字列はFalse、それ以外はTrueになる性質を利用 3 x = int(x)

質問2

以下のように行なえます。

  • Dataに適当なメソッドを定義。出席番号は必ず必要な引数とする。辞書かキーワード引数で項目と書き換えた後の値をペアにして渡す
  • Dataのself.all_itemsを線形探索して出席番号に該当する生徒のデータを取り出す
  • 書き換える

ただし

そもそもクラスの設計が悪いので、まずは書き直した方が良いです。

  • assignでインスタンス変数に代入してからadd_dataを呼ぶ意味がわからない。うっかりadd_dataを呼び忘れたらどうするのかと。それなら最初からassignの中でデータを追加した方が良いです。
  • そもそも、self.all_items = []に辞書で表現した生徒情報を入れる+αくらいの機能しかないクラスは要らない。
  • やりたいことによってはStudentクラスを先に作ったほうが良いかもしれません。

投稿2018/10/30 05:39

hayataka2049

総合スコア30933

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

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

123123123

2018/10/30 06:10

回答ありがとうございます。 質問1について 無事できました。ありがとうございます。 質問2について 但し書きのほうを先に検討したほうがよいかと思い、まずはこちらに返信いたします。 本を見ながら書いたので、よくわかってなかったです。assignでひとまとめにしても大丈夫なんですね。勉強になりました。 今のところ、このほかにもテストの点数なども入れる予定です。 (使ってみて、やることをさらに考えていく部分はあります。) それだと、Dataはクラスにする必要がなくて、Studentにするほうがよいでしょうか。
hayataka2049

2018/10/30 06:17 編集

pythonは組み込みのオブジェクト(listやdictなど)が強いので、組み込みのオブジェクトの操作を通じてオブジェクト指向に慣れ親しんでからクラスを書いても遅くないと感じています。 一回listとdictで書けるところまで書いてみては?
123123123

2018/10/30 08:29

わかりました。ありがとうございます。 classが必要かどうかも、検討してみます。
guest

0

入力が数字の場合のみ、int 型にする方法

try-except を使う。

数字でない文字列で int() オブジェクトを作成しようとすると、ValueError が発生するので、それを catch します。

python

1try: 2 val = int(input()) 3except ValueError: 4 val = None 5print('val = {}'.format(val))

str.isdigit() でチェックする。

文字列が数字かどうかは isdigit() で判断できるので、数字の場合のみ、変換します。

python

1val = input() 2if val.isdigit(): 3 val = int(val) 4print('val = {}'.format(val))

サンプルコード

python

1class Data: 2 def __init__(self): 3 self.all_items = [] 4 5 def add_data(self, number, last_name, first_name, option_1, option_2, option_3): 6 self.all_items.append({'number' : number, 7 'last_name': last_name, 8 'first_name': first_name, 9 'option_1': option_1, 10 'option_2': option_2, 11 'option_3': option_3}) 12 13 def show_all(self): 14 for i in self.all_items: 15 print(i) 16 17 18if __name__ == "__main__": 19 num_students = int(input('生徒の数を教えてください。')) 20 jikken = Data() 21 22 for i in range(1, num_students + 1): 23 print('出席番号{}のデータを入力'.format(i)) 24 last_name = input('苗字を入力') 25 first_name = input('名前を入力') 26 27 score1 = input('選択教科1を入力') 28 score1 = int(score1) if score1.isdigit() else None 29 30 score2 = input('選択教科2を入力') 31 score2 = int(score2) if score2.isdigit() else None 32 33 score3 = input('選択教科3を入力') 34 score3 = int(score3) if score3.isdigit() else None 35 36 jikken.add_data(i, last_name, first_name, score1, score2, score3) 37 jikken.show_all()
生徒の数を教えてください。2 出席番号1のデータを入力 苗字を入力田中 名前を入力太郎 選択教科1を入力10 選択教科2を入力20 選択教科3を入力 出席番号2のデータを入力 苗字を入力山田 名前を入力太郎 選択教科1を入力100 選択教科2を入力 選択教科3を入力 {'number': 1, 'option_1': 10, 'option_2': 20, 'first_name': '太郎', 'last_name': '田中', 'option_3': None} {'number': 2, 'option_1': 100, 'option_2': None, 'first_name': '太郎', 'last_name': '山田', 'option_3': None}

投稿2018/10/30 05:24

tiitoi

総合スコア21956

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

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

123123123

2018/10/30 05:51

ご回答ありがとうございます。 except ValueError: のときは、私のそのあとの表記が悪かったみたいです。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問