web-dev-qa-db-ja.com

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

例として...

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

そのため、string1、string2、string3 ...ですべてが「Hello」になります

93
Takkun

もちろんできます; 辞書 と呼ばれる:

d={}
for x in range(1,10):
        d["string{0}".format(x)]="Hello"

In [7]: d["string5"]
Out[7]: 'Hello'

In [8]: d
Out[8]: 
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

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

123
the wolf

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

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

そして、例えば:

print(string3)

あなたに与えます:

Hello

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

49
Tadeck

変数の変数名を作成するのは無意味です。どうして?

  • それらは不要です:リスト、辞書などにすべてを保存できます
  • 作成が難しい: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
11
Jochen Ritzel

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

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()からの戻り値を変更することはお勧めできません

9
Aaron Goldman

これを行う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文字列フォーマットを利用しています。

8
Collin W.

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

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

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

string[x]

xは、どの "Hello"が必要かを識別します。

したがって、print(string[1])Helloを出力します。

2
Lledargo

for x in range(9): exec("string"+str(x)+" = 'hello'")

これは動作するはずです。

1
Abhishek Rai

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

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

ここに例があります-さまざまなブランチにいくつかのネットワークスイッチ(たとえば2〜8)があります。ここで、特定のブランチで使用可能なスイッチの数を決定する方法(またはalive-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 __== '__main__':
    main()

出力は次のとおりです。

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07

0
Cumar Chan