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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

9635閲覧

構造体の配列またはリスト

shiri

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/31 10:18

Pythonで構造体の配列を作る方法をご教授いただけないでしょうか?

class person: pass mike = person() mike.name = 'Mike' mike.age = 21 print(f'name: {mike.name}, age: {mike.age}')

pythonには構造体がないので上記のように擬似的な動きをさせるサンプルを見つけました。
ただ、これを配列として複数扱いたいときに
たとえば以下のようにリストの要素ごとにclassを実行させたとしても

class person: pass mike = [] mike[0] = person() mike[1] = person() mike[0].name = 'Yuko' mike[0].age = 18 mike[0].hoge =1 mike[1].name = 'Mike' mike[1].age = 21 mike[1].hoge =3
Traceback (most recent call last): mike[0] = person() IndexError: list assignment index out of range

のようにclassを作るとエラーとなってしまいます。
これを解決する方法または、他にpythonで構造体の配列を実現させる方法はないでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python本体には構造体配列はありませんが、numpyにはStructured arrays(構造体配列)という機能があります。

C言語などでpersonのようなものを作る場合、

方法1 nameの長さに上限があるなら文字配列のメンバとageという整数型のメンバをもつ構造体配列を作る方法
方法2 nameの長さに上限がないなら文字配列へのポインタのメンバとageという整数型のメンバをもつ構造体配列を作る方法

がありますね。numpyでも同じように二つの方法があります。

方法1 nameの長さに上限がある場合

python

1>>> person_type = [('name', 'U10'), ('age', 'i4'), ('hoge', 'i4')] 2>>> persons = np.array([('Yuko', 18, 1), ('Mike', 21, 3)], dtype = person_type) 3>>> persons 4array([('Yuko', 18, 1), ('Mike', 21, 3)], 5 dtype=[('name', '<U10'), ('age', '<i4'), ('hoge', '<i4')]) 6>>> persons[0] 7('Yuko', 18, 1) 8>>> persons[0]['name'] 9'Yuko' 10>>> persons['name'] 11array(['Yuko', 'Mike'], dtype='<U10')

方法2 nameの長さに上限がない場合

python

1>>> person_type = [('name', 'O'), ('age', 'i4'), ('hoge', 'i4')] 2>>> persons = np.array([('Yuko', 18, 1), ('Mike', 21, 3)], dtype = person_type) 3>>> persons 4array([('Yuko', 18, 1), ('Mike', 21, 3)], 5 dtype=[('name', 'O'), ('age', '<i4'), ('hoge', '<i4')]) 6>>> persons[0] 7('Yuko', 18, 1) 8>>> persons[0]['name'] 9'Yuko' 10>>> persons['name'] 11array(['Yuko', 'Mike'], dtype=object)

投稿2021/08/31 11:41

ppaul

総合スコア24666

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

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

shiri

2021/08/31 12:23

ご回答ありがとうございます。ご提示の方法で解決できそうです
guest

0

エラーメッセージぐらい読みましょう!!!!

Traceback (most recent call last): mike[0] = person() IndexError: list assignment index out of range [訳] トレースバック(最近呼ばれたもの): mike... IndexError: リストの要素数が多すぎ!!!!

IndexErrorは、「要素数が多すぎ」ってことです。

要素数が10しかないリスト(配列)を arr[12] とかみたいにアクセスしたりしているとか。

エラーメッセージが出ている部分を見る限り、要素数が0とかみたいなものじゃないかなと。

で、Pythonのリストに追加する場合は、リストのappendメソッドを使います。

参考: ヒント1

つまり、基礎が出来ていないだけ

投稿2021/08/31 10:48

BeatStar

総合スコア4958

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

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

shiri

2021/08/31 12:26

ありがとうございます。解決いたしました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問