第115回【Python】構造体の作成、構造体の検索

現在取り組んでいるのは、paiza ラーニング問題集「クラス・構造体メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 115 回目です。

今回からは「クラス・構造体メニュー」の挑戦します。クラスや構造体を上手く使いこなすことが出来ればコードの実行速度が上がります。いきなりクラスを書き始める人は尊敬です。LeoSaki(旦那)はコードを書きながらクラス化するにはどうすればいいか、と考えながらでないと書けません。まだまだ未熟者です。

それでは、今日も頑張ってみようと思います。

構造体の作成

クラスの学級委員である paiza 君は、クラスのみんなに次のような形式でアカウントの情報を送ってもらうよう依頼しました。

名前 年齢 誕生日 出身地

送ってもらったデータを使いやすいように整理したいと思った paiza 君はクラス全員分のデータを次の形式でまとめることにしました。

User{
nickname : 名前
old : 年齢
birth : 誕生日
state : 出身地
}

クラスメートの情報が与えられるので、それらを以上の形式でまとめたものを出力してください。

N
n_1 o_1 b_1 s_1
...
n_N o_N b_N s_N

・ 1 行目では、paiza君のクラスの人数 N が与えられます。
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) では、 i 番の生徒の名前・年齢・誕生日・出身地を表す整数・文字列 n_i ,o_i ,b_i , s_i が順に半角スペース区切りで与えられます。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ N ≦ 10
・ n_i , s_i (1 ≦ i ≦ N) は 1 文字以上 20 文字以下の文字列
・ b_i (1 ≦ i ≦ N) はMM/DD 形式の文字列(例 1月2日 → 01/02 12月31日 → 12/31)
・ 1 ≦ o_i ≦ 100


入力例

3
mako 13 08/08 nara
megumi 14 11/02 saitama
taisei 16 12/04 nagano

出力例

User{
nickname : mako
old : 13
birth : 08/08
state : nara
}
User{
nickname : megumi
old : 14
birth : 11/02
state : saitama
}
User{
nickname : taisei
old : 16
birth : 12/04
state : nagano
}

うーん。この出力だけならば、構造体なんだろうか・・・。

Python
N = int(input())
for _ in range(N):
    n,o,b,s = map(str,input().split())
    print('User{')
    print(f'nickname : {n}')
    print(f'old : {o}')
    print(f'birth : {b}')
    print(f'state : {s}')
    print('}')
VBA
N = Cells(1, 1)
For i = 1 To N
    S = Split(Cells(i + 1, 1), " ")
    Debug.Print "User{"
    Debug.Print "nickname : " & S(0)
    Debug.Print "old : " & S(1)
    Debug.Print "birth : " & S(2)
    Debug.Print "state : " & S(3)
    Debug.Print "}"
Next

構造体の検索

クラスの学級委員である paiza 君は、クラスのみんなに次のような形式でアカウントの情報を送ってもらうよう依頼しました。

名前 年齢 誕生日 出身地

送ってもらったデータを使いやすいように整理したいと思った paiza 君はクラス全員分のデータを次の形式でまとめることにしました。

User{
nickname : 名前
old : 年齢
birth : 誕生日
state : 出身地
}

年齢ごとの生徒の名簿を作る仕事を任された paiza 君はクラスメイトのうち、決まった年齢の生徒を取り出したいと考えました。
取り出したい生徒の年齢が与えられるので、その年齢の生徒の名前を出力してください。

N
n_1 o_1 b_1 s_1
...
n_N o_N b_N s_N
K

・ 1 行目では、paiza君のクラスの人数 N が与えられます。
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) では、 i 番の生徒の名前・年齢・誕生日・出身地を表す整数・文字列 n_i ,o_i ,b_i , s_i が順に半角スペース区切りで与えられます。
・ N + 2 行目では、検索したい生徒の年齢 K が与えられます。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ N ≦ 10
・ n_i , s_i (1 ≦ i ≦ N) は 1 文字以上 20 文字以下の文字列
・ b_i (1 ≦ i ≦ N) はMM/DD 形式の文字列(例 1月2日 → 01/02 12月31日 → 12/31)
・ 1 ≦ o_i , K ≦ 100
・ 年齢が K であるような生徒はクラスに 1 人


入力例

3
mako 13 08/08 nara
megumi 14 11/02 saitama
taisei 16 12/04 nagano
14

出力例

megumi

急にコードを書いている感の強い問題が出題された。

Python
class Student:
    def __init__(self,nickname,old,birth,state):
        self.nickname = nickname
        self.old = old
        self.birth = birth
        self.state = state

N = int(input())
students = [None] * N
for i in range(N):
    n,o,b,s = map(str,input().split())
    students[i] = Student(n,o,b,s)

K = input()
for student in students:
    if student.old == K:
        print(student.nickname)
        break
VBA
Type Students

    name As String
    old As Integer
    birth As String
    state As String
    
End Type
Sub class_primer__find()

    N = Cells(1, 1)
    Dim mem() As Students
    ReDim mem(N - 1)
    For i = 0 To N - 1
        S = Split(Cells(i + 2, 1), " ")
        mem(i).name = S(0)
        mem(i).old = Val(S(1))
        mem(i).birth = S(2)
        mem(i).state = S(3)
    Next
    K = Cells(N + 2, 1)
    For i = LBound(mem) To UBound(mem)
        If mem(i).old = K Then
            Debug.Print mem(i).name
            Exit For
        End If
    Next
    
End Sub

最後に

なんかこう、修正が発生した際にも、クラスや構造体をちょっと修正すればいい感じになって、可読性も保守性も上がる気がする。VBA ではあまり使った記憶がなかったのだが、過去のコードを見ていたら、それなりに使っていたらしい。

その割には、今回問題に取り組むにあたって、いろいろ調べ直して、使い方に間違いがないか確認した。全然身についてないじゃん・・・。反省。

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki