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

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

ただいまの
回答率

88.64%

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

解決済

回答 2

投稿

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

123123123

score 12

生徒個別の情報を登録し、今後活用するために、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()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

質問1

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

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

質問2

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

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

 ただし

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/30 15:10

    回答ありがとうございます。
    質問1について
    無事できました。ありがとうございます。

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

    キャンセル

  • 2018/10/30 15:17 編集

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

    キャンセル

  • 2018/10/30 17:29

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

    キャンセル

0

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

 try-except を使う。

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

try:
   val = int(input())
except ValueError:
   val = None
print('val = {}'.format(val))

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

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

val = input()
if val.isdigit():
    val = int(val)
print('val = {}'.format(val))

 サンプルコード

class Data:
    def __init__(self):
        self.all_items = []

    def add_data(self, number, last_name, first_name, option_1, option_2, option_3):
        self.all_items.append({'number' : number,
                               'last_name': last_name,
                               'first_name': first_name,
                               'option_1': option_1,
                               'option_2': option_2,
                               'option_3': option_3})

    def show_all(self):
        for i in self.all_items:
            print(i)


if __name__ == "__main__":
    num_students = int(input('生徒の数を教えてください。'))
    jikken = Data()

    for i in range(1, num_students + 1):
        print('出席番号{}のデータを入力'.format(i))
        last_name = input('苗字を入力')
        first_name = input('名前を入力')

        score1 = input('選択教科1を入力')
        score1 = int(score1) if score1.isdigit() else None

        score2 = input('選択教科2を入力')
        score2 = int(score2) if score2.isdigit() else None

        score3 = input('選択教科3を入力')
        score3 = int(score3) if score3.isdigit() else None

        jikken.add_data(i, last_name, first_name, score1, score2, score3)
    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 14:51

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

    キャンセル

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

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

関連した質問

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