🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
冗長化

冗長化とは、システムの一部に障害が発生してもサービスを継続できるようシステム構築を行うこと。要する量より多く予備装置を準備しバックアップとして配置しておきます。また、冗長化による安全性は、冗長性と呼ばれています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

解決済

3回答

1256閲覧

Python-for文での自動化がうまくいきません。

ttan

総合スコア1

冗長化

冗長化とは、システムの一部に障害が発生してもサービスを継続できるようシステム構築を行うこと。要する量より多く予備装置を準備しバックアップとして配置しておきます。また、冗長化による安全性は、冗長性と呼ばれています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2020/12/01 16:47

前提・実現したいこと

Pythonでコードを書いています。
A1〜A10の2次元リストを以下のソースコードで生成し、A1,A2,,,A10それぞれのリストの中身をprint(A1)指定するのではなく、for文を使ってprintしたいのですが、うまくできません。

該当のソースコード

XMAX = 5 YMAX = 5 N=10 for n in range(1, N+1): command = "" # this line is here to clear out the previous command command = "A" + str(n) + " = [[0 for i in range(XMAX)]for j in range(YMAX)]" exec(command)

試したこと

print("A1=",A1) print("A2=",A2) ・・・ print("A10=",A10) #A1= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] #A2= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] ・・・ #A10= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

のような出力をfor文で自動化したいです。以下の文ではダメなのはわかっているのですが、、、

for n in range(1, N+1): name = "" name = "S" + str(n) print(name) #A1 #A2 #A3 #A4 #A5 #A6 #A7 #A8 #A9 #A10

補足情報(FW/ツールのバージョンなど)

どう言語化していいかわからず、不明瞭な質問で申し訳ございません。よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

「変数A1~A10をexecを使って動的に作成し、それをひとつひとつ変数名を指定せずにfor文でprintで表示したい」ということですよね? 表示するときもexecを使えばできますが。

それなら、リストを使ってください。動的に変数を作るのは筋が悪い方法です。
理由は、

  • あなたが今困っているように、for文などでまとめて処理するのが難しい。
  • 文字列中に関数名や変数名などを書くことになるので、linterなどのサポートを受けられない。

からですね。

Python

1XMAX = 5 2YMAX = 5 3N = 10 4 5A = [[]] # A[0]は使わない前提 6for n in range(1, N + 1): 7 A.append([[0] * XMAX for _ in range(YMAX)]) 8 9for n in range(1, N + 1): 10 print(A[n])

投稿2020/12/01 17:09

Daregada

総合スコア11990

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

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

0

Daregadaさんの書かれているように、execを使った変数の自動生成は(主にセキュリティ上の問題から)推奨されないことが多いようです。
A1~A10までの名前を生成しつつ、それと2次元リストを紐付けたいということでしたら、辞書機能を使う手もあります。

python3

1XMAX = 5 2YMAX = 5 3N=10 4A_dct = {f"A{n}":[[0 for i in range(XMAX)]for j in range(YMAX)] for n in range(1, N+1)} # A1~A(N)を辞書に格納 5for n in range(1, N+1): 6 print(f"A{n}=",A_dct[f"A{n}"]) 7# A1= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 8# A2= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 9# A3= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 10# A4= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 11# A5= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 12# A6= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 13# A7= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 14# A8= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 15# A9= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 16# A10= [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

投稿2020/12/01 23:20

jeanbiego

総合スコア3966

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

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

0

ttanさんの求めているプログラムは以下のものでしょうか。

python

1N=10 2for n in range(1, N+1): 3 print("A" + str(n) + "=", eval("A" + str(n)))

文を実行するのはexecですが、値を取り出すにはevalを使います。

globalsを使う方法もあります。
globals()という辞書の属性には、その名前の変数の値が入っています。
正確に言うと、globals()という辞書が変数を管理しています。

pythn

1>>> spam = 42 2>>> print(globals()["spam"]) 342

これを使っても、exeやevalを使わずにttanさんのやりたいことは実現できます。

python

1>>> XMAX = 2 2>>> YMAX = 2 3>>> N=5 4>>> for n in range(1, N+1): 5... globals()["A" + str(n)] = [[10*n+j for i in range(XMAX)]for j in range(YMAX)] 6... 7>>> print("確認用 A1 =", A1) 8確認用 A1 = [[10, 10], [11, 11]] 9>>> 10>>> for n in range(1, N+1): 11... print("A" + str(n) + "=", globals()["A" + str(n)]) 12... 13A1= [[10, 10], [11, 11]] 14A2= [[20, 20], [21, 21]] 15A3= [[30, 30], [31, 31]] 16A4= [[40, 40], [41, 41]] 17A5= [[50, 50], [51, 51]]

投稿2020/12/01 22:15

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問