ループ中に異なる変数名をどのように作成しますか?[重複]


125

例として...

for x in range(0,9):
    string'x' = "Hello"

だから私はstring1、string2、string3で終わります...すべて「Hello」に等しくなります


34
答えは、これを実行したくないということです。代わりにリストを使用してください。
Sven Marnach、2011年

2
これがあなたがそれを使用したい場所であるなら、あなたはx = ["Hello" * 9]それによってそれにアクセスすることができx[0], x[1] ...ます。別の方法でそれを使用したいなら、私はあなたに私たちにもう少しコードの背景を提供する必要があると思います。
James Khoury、

3
私が言語の力を持っている場合、変数名に数字を使用するとSyntaxError: Use a data structure.;-) が得られます
Jochen Ritzel

1
string0を忘れないでください;)
wim

10
@James Khoury:そうではありません。これはx、単一の要素(文字列 "HelloHelloHelloHelloHelloHelloHelloHelloHello")を含むリストになることになります。あなたが意味したと思いますx = ["Hello"] * 9

回答:


162

できますよ; それは辞書と呼ばれています

d = {}
for x in range(1, 10):
    d["string{0}".format(x)] = "Hello"
>>> d["string5"]
'Hello'
>>> d
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

私はこれを幾分チェックして言ったが、ある値を別の値に関連付ける実際の最良の方法は辞書です。それがそのために設計されたのです!


62

それは本当に悪い考えですが...

for x in range(0, 9):
    globals()['string%s' % x] = 'Hello'

そして、例えば:

print(string3)

あなたに与えるでしょう:

Hello

しかし、これは悪い習慣です。他の人が提案するように、代わりに辞書またはリストを使用する必要があります。もちろん、どうすればいいのか知りたくて使いたくなかったのでなければ。


2
これが悪い考えである理由を詳しく説明できますか?
ajdigregorio 2014

6
@paintedcones:最初に、それを行う方法が1つあるはずです。シンプルな辞書を使用する方が自然です。代わりにグローバルディクショナリを使用することは、「暗黙的に」グローバル変数を作成または変更するため、お勧めできません。この方法で変数を設定および変更するには辞書表記法が必要なので、globals()単純なの代わりに使用する理由はありませんdict
Tadeck 2014

一連の変数、x1、x2、x3などを作成する必要がある場合がいくつかあります。しかし、ほとんどの場合、辞書を使用するのが最も適切な方法です。
DevilApple227 2016

20

これを行う1つの方法は、を使用することですexec()。例えば:

for k in range(5):
    exec(f'cat_{k} = k*2')
>>> print(cat_0)
0
>>> print(cat_1)
2
>>> print(cat_2)
4
>>> print(cat_3)
6
>>> print(cat_4)
8

ここでは、Python 3.6以降の便利なf文字列フォーマットを利用しています。


5
exec何か、ブラックマジック、攻撃の脆弱性、悪いことを覚えておいてください。
psaxton 2017年

18

変数名を作成しても意味がありません。どうして?

  • それらは不要です:リスト、辞書などにすべてを保存できます
  • それらを作成するのは難しいです:execまたはを使用する必要がありますglobals()
  • それらを使用することはできません:これらの変数を使用するコードをどのように記述しますか?exec/globals()もう一度使う必要があります

リストの方がはるかに簡単です:

# 8 strings: `Hello String 0, .. ,Hello String 8`
strings = ["Hello String %d" % x for x in range(9)]
for string in strings: # you can loop over them
    print string
print string[6] # or pick any of them

ありがとうございました!!辞書またはデータフレームのリストからフォームを選択する必要がありました。また、データフレームの特定の値に基づいてデータフレームを並べ替える必要があるため、辞書形式を使用することはできませんでした。うん、君のいうとおりだ!場合によっては、変数名を作成しても意味がありません。
シン

9

辞書を使用しないでください

import sys
this = sys.modules[__name__] # this is now your current namespace
for x in range(0,9):
    setattr(this, 'string%s' % x, 'Hello')

print string0
print string1
print string2
print string3
print string4
print string5
print string6
print string7
print string8

辞書を使用しないでください

globals()は、ネームスペースが現在指しているものを提供するのでリスクがありますが、これは変更される可能性があるため、globals()からの戻りを変更することはお勧めできません



3

私はリストを使用します:

string = []
for i in range(0, 9):
  string.append("Hello")

この方法では、9つの "Hello"があり、次のように個別に取得できます。

string[x]

どこxで「こんにちは」が欲しいかを特定します

したがって、print(string[1])印刷されますHello


1
一部の言語とは異なり、まだ存在しないPythonリストの要素に割り当てることはできません(「リスト割り当てインデックスが範囲外です」エラーが発生します)。string.append("Hello")代わりに使用することができます。
グレッグヒューギル

1
私はそれを知っているべきでした、私に思い出させてくれてありがとう。固定されています。
Ledargo、2011年

配列に追加するのではなく、文字列の末尾に追加することを考えていました。みなさん、お詫びします。
Ledargo、2011年

体系的には、「あなたは9つの「こんにちは」を持っているだろう」は「あなたは1つの「こんにちは」を9回持っているだろう」であるべきです。9つの異なる文字列ではなく、同じ文字列を繰り返します。
ダンカン

2

ここでの課題は、global()を呼び出すことではないと思います

保持する(動的)変数のリストを個人的に定義し、forループ内でそれに追加します。次に、個別のforループを使用して各エントリを表示するか、他の操作を実行します。

ここに例があります-私はさまざまなブランチにいくつかのネットワークスイッチ(たとえば2から8の間)を持っています。ここで、特定のブランチで使用可能なスイッチ(またはアライブ-pingテスト)の数を判別し、それらに対していくつかの操作を実行する方法があることを確認する必要があります。

これが私のコードです:

import requests
import sys

def switch_name(branchNum):
    # s is an empty list to start with
    s = []
    #this FOR loop is purely for creating and storing the dynamic variable names in s
    for x in range(1,8,+1):
        s.append("BR" + str(branchNum) + "SW0" + str(x))

    #this FOR loop is used to read each of the switch in list s and perform operations on
    for i in s:
        print(i,"\n")
        # other operations can be executed here too for each switch (i) - like SSH in using paramiko and changing switch interface VLAN etc.


def main():  

    # for example's sake - hard coding the site code
    branchNum= "123"
    switch_name(branchNum)


if __name__ == '__main__':
    main()

出力は次のとおりです。

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

辞書を使用することは、変数と関連する値を保持するための正しい方法である必要があり、これを使用できます。

dict_ = {}
for i in range(9):
     dict_['string%s' % i]  = 'Hello'

ただし、変数をローカル変数に追加する場合は、次のコマンドを使用できます。

for i in range(9):
     exec('string%s = Hello' % i)

また、たとえば、0〜8の値を割り当てる場合は、次のように使用できます。

for i in range(9):
     exec('string%s = %s' % (i,i))

0

辞書には値を含めることができ、値はupdate()メソッドを使用して追加できます。システムで変数を作成する必要があるため、どこに保持するかを知っておく必要があります。

variables = {}
break_condition= True # Dont forget to add break condition to while loop if you dont want your system to go crazy.
name = variable
i = 0 
name = name + str(i) #this will be your variable name.
while True:
    value = 10 #value to assign
    variables.update(
                  {name:value})
    if break_condition == True:
        break
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.