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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

Q&A

解決済

2回答

7165閲覧

python3で複数のインスタンスをfor文を使ってリストに入れたい

yujico

総合スコア25

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

0グッド

0クリップ

投稿2020/02/25 10:06

前提・実現したいこと

item_1~itemn_100
という感じで作成したクラスのインスタンスをfor in range()文を使ってitems[]というリストにすべて入れたいと思っています。

該当のソースコード

下記のような要領で実装できるのかなと思ったのですが。。。

python3

1# Itemクラスからitem_0~item_100という変数名のインスタンスを作成 2item_0 = Item('hoge') 3item_1 = Item('fuga') 4. 5. 6. 7item_100 = Item('hogehoge') 8 9 10#itemsリストを用意 11items = [] 12# for分でインスタンスをリストに挿入していく 13for i in range(101): 14 items.append(item_ + i)

当たり前と言えばそうなのですが、
item_
までで評価されてしまうようで、下記のエラーが出てしまいます。

NameError: name 'item_' is not defined

手書きでリストに一つずつインスタンスを挿入していくのはいかにもプログラミングらしくないしヒューマンエラーも起こりやすいので、なんとかスマートに実装したいのですが、どうするのがベストでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

item_1~itemn_100

という感じで作成したクラスのインスタンス

インスタンスを作るために変数に入れる必要はありません。変数に入れるとしてもインスタンスの数だけ変数を用意する必要もありません。

よって、一番直感的なのはリテラルでベタ書きすることです。

python

1items = [Item('hoge'), 2 Item('fuga'), 3 # ..., 4 Item('hogehoge')]

コンストラクタに渡している引数のリストみたいなものを持っているのであれば、ループも活かせます。

python

1data = ['hoge', 'fuga', "# ...", 'hogehoge'] 2items = [Item(arg) for arg in data]

投稿2020/02/25 10:14

hayataka2049

総合スコア30933

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

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

yujico

2020/02/25 10:24 編集

早速ご回答いただきありがとうございます。 Itemクラスは、質問では簡易にするためにコンストラクタに渡す引数を1つにしていますが、実は6程度あり、その場合、おそらく後者だと ``` data = ['hoge1','hoge2',...,hoge6, 'fuga1','fuga2'...fuga6,'hogehoge6'] ``` のようにすべてのデータをごそっとdataリストに入れると言うことでしょうか? だとすると、今回のケースだと前者の方がいいかもしれないですね。 ありがとうございます!
hayataka2049

2020/02/25 10:25

data = [('hoge1', 'hoge2', ..., 'hoge6'), ...] のようにして [Item(*args) for args in data] としてください。 内側はtupleじゃなくてlistでもいいし、引数名と対応付けたいので辞書にするといった判断もありですが、「引数の値を入れた何かのリスト」のような形式にしないととても扱いづらくなります。*は引数リストのアンパックです。
hayataka2049

2020/02/25 10:26

あるいは data1 = ['hoge1', 'fuga1', ...] data2 = ['hoge2', 'fuga2', ...] ... のような形でデータが得られるなら、zipを使って上の形式に変換することが可能です。
yujico

2020/02/25 11:29

なるほど、そのようにすると、後者でも視認性を担保できそうですね。 どちらが適切か比較して決めようと思います。 ありがとうございます!
hayataka2049

2020/02/25 11:42

100*6のデータは、そもそもソースコードに埋め込まないで外部のCSVやJSONなどのテキストファイルから読み込むことも検討されるべきものだと思います。参考までに。
yujico

2020/02/25 11:47

確かにそうですよねw 今回作成しているプログラムが完全に自分専用で、なるべく短時間で作ってしまいたかったという理由がありまして。(にしてもテキストファイルからの読み込みの方が逆に簡単だったかなとも思いますが) 参考にさせていただきます。
guest

0

基本的にはhayataka2049さんの言うようにリテラルで書くか外部ファイル化するのがいいと思います。

どうしても元の書き方がしたいなら、

python

1locals()['item_'+str(i)]

で動的に変数を参照できます。

投稿2020/02/25 17:02

編集2020/02/25 17:03
kairi003

総合スコア1330

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

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

yujico

2020/02/26 01:21

こんな方法があるとは眼から鱗です。 kairi003様がおっしゃるように、正攻法はhayaka2049さんの方法だと思いますので、おそらくそちらを採用すると思いますが、こういう手法があるということは頭に入れておきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問