web-dev-qa-db-ja.com

Python forループで変数名を変更する

誰かがこのような何かのためにforループに基づいて変数名を変更する方法を知っているかどうか疑問に思っていました:

for i in range(3)
     group+i=self.getGroup(selected, header+i)

データを収容するために変数の名前が変わるようにします。ありがとう!

〜サム

23
user130633

おそらく、個別の変数の代わりに辞書が必要です。例えば

d = {}
for i in range(3):
    d["group" + str(i)] = self.getGroup(selected, header+i)

実際にローカル変数を変更する場合は、locals関数を使用できます。

for i in range(3):
    locals()["group"+str(i)] = self.getGroup(selected, header+i)

一方、実際にあなたがいるクラスのインスタンス変数を変更したい場合は、setattr関数を使用できます。

for i in group(3):
    setattr(self, "group"+str(i), self.getGroup(selected, header+i)

そしてもちろん、私はこれらのすべての例で、リストが欲しいだけではないと仮定しています:

groups = [self.getGroup(i,header+i) for i in range(3)]
43
Eli Courtwright

リストを使用します。

groups = [0]*3
for i in xrange(3):
    groups[i] = self.getGroup(selected, header + i)

またはより「Pythonically」:

groups = [self.getGroup(selected, header + i) for i in xrange(3)]

価値があるものについては、could変数を「間違った」方法で作成しようとします。つまり、値を保持する辞書を変更します。

l = locals()
for i in xrange(3):
    l['group' + str(i)] = self.getGroup(selected, header + i)

しかし、それは本当に悪い形であり、おそらく動作することさえ保証されていません。

8
David Z

代わりにリストを使用したいようです:

group=[]
for i in range(3):
     group[i]=self.getGroup(selected, header+i)
2
Greg Hewgill

受け入れられたソリューションで説明されているように、「group」+ str(i)キーを使用する辞書を間違いなく使用する必要がありますが、execを使用してソリューションを共有したかったのです。文字列をコマンドに解析して動的に実行する方法。辞書を使用する代わりに、要件に応じてこれらのスカラー変数名を作成できます。これは、何をすべきでないかに関して、そしてあなたができるからといって、そうすべきだという意味ではないかもしれません。スカラー変数を使用することが厳しい要件である場合にのみ適切なソリューションです:

l = locals()
for i in xrange(3):
    exec("group" + str(i) + "= self.getGroup(selected, header + i)")

Djangoモデルの例を使用してこれが機能する別の例。exec代替ソリューションはコメント化され、dict属性はより意味があります:

Class A(models.Model):

    ....

    def __getitem__(self, item):  # a.__getitem__('id')
        #exec("attrb = self." + item)
        #return attrb
        return self.__dict__[item]

そもそも辞書から拡張してsetattrおよびgetattr関数を取得する方が合理的かもしれません。

pythonコマンドを動的に生成して実行するなど、解析が必要な状況:) execが必要です:) exec here の詳細。

2
radtek