Bir döngüdeyken nasıl farklı değişken adları yaratırsınız? [çiftleme]


125

Örnek amaçlar için ...

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

Bu yüzden dize1, dize2, dize3 ... hepsi "Merhaba" ye eşit


34
Cevap, bunu yapmak istememenizdir. Bunun yerine bir liste kullanın.
Sven Marnach

2
Kullanmak istediğiniz yer burasıysa, daha x = ["Hello" * 9]sonra ona erişebilirsiniz. x[0], x[1] ...Farklı bir şekilde kullanmak istiyorsanız, bize biraz daha kod arka planı vermeniz gerektiğini düşünüyorum.
James Khoury

3
Eğer bir dil üzerinde gücüm varsa, o zaman değişken isimlerde sayı kullanmak SyntaxError: Use a data structure.;-)
Jochen Ritzel

1
ve dizenizi unutmayın0;)
wim

10
@James Khoury: Bu pek doğru değil. Bu, xtek bir öğe içeren bir listeyle sonuçlanır - "HelloHelloHelloHelloHelloHelloHelloHelloHello" dizesi. Sanırım demek istedin x = ["Hello"] * 9.

Yanıtlar:


163

Tabi ki yapabilirsin; buna sözlük denir :

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'}

Bunu biraz kontrol altında söyledim, ama gerçekten bir değeri başka bir değerle ilişkilendirmenin en iyi yolu bir sözlüktür. Bunun için tasarlandı!


62

Gerçekten kötü bir fikir, ama ...

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

ve sonra örneğin:

print(string3)

sana vereceğim:

Hello

Ancak bu kötü bir uygulamadır. Başkalarının önerdiği gibi bunun yerine sözlükler veya listeler kullanmalısınız. Tabii, nasıl yapılacağını gerçekten bilmek istemediyseniz, ancak kullanmak istemediyseniz.


2
Bunun neden kötü bir fikir olduğunu açıklayabilir misin?
ajdigregorio

6
@paintedcones: Öncelikle, bunu yapmanın bir yolu olmalı ve basit sözlükler kullanmak daha doğal. Bunun yerine globals sözlüğünü kullanmak kötü bir fikirdir, çünkü aynı zamanda "dolaylı olarak" global değişkenler oluşturur veya onları değiştirir. Değişkenleri bu şekilde hem ayarlamak hem de değiştirmek sözlük gösterimini gerektirdiğinden globals(), bazı basitler yerine kullanmak için bir neden yoktur dict.
Tadeck

Bir dizi değişken, x1, x2, x3, vb. Oluşturmanız gereken birkaç durum vardır. Ancak çoğu durumda, sözlük kullanmak gerçekten yapılacak en uygun şeydir.
DevilApple227

20

Bunu yapmanın bir yolu şudur exec(). Örneğin:

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

Burada Python 3.6 + 'daki kullanışlı f string biçimlendirmesinden yararlanıyorum


5
Bir execşeyi hatırlayın , kara büyü, saldırı açıkları, kötü şeyler, ama sorulduğu gibi soruyu yanıtlıyor.
psaxton

18

Değişken değişken adları oluşturmak anlamsızdır. Neden?

  • Gereksizler: Her şeyi listelerde, sözlüklerde vb. Saklayabilirsiniz.
  • Yaratmak zordur: Kullanmak zorundasınız execveyaglobals()
  • Bunları kullanamazsınız: Bu değişkenleri kullanan kodu nasıl yazarsınız? exec/globals()Tekrar kullanmalısın

Liste kullanmak çok daha kolaydır:

# 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

Teşekkür ederim!! Sözlük veya veri çerçevesi listesi arasından formu seçmem gerekiyordu. Veri çerçevesini, veri çerçevesindeki belirli bir değere göre yeniden düzenlemem gerektiğinden, sözlük formunu kullanamazdım. Evet haklısın! Bazı durumlarda değişken isimleri yaratmak gerçekten anlamsızdır!
Doo Hyun Shin

9

Bunu yapma sözlük kullanma

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

bunu yapma bir söz kullanma

globals (), size ad alanının şu anda işaret ettiği şeyi verdiğinden risklidir, ancak bu değişebilir ve bu nedenle globals () 'dan dönüşü değiştirmek iyi bir fikir değildir


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

Bu çalışmalı.


3

Bir liste kullanırdım:

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

Bu şekilde, 9 "Merhaba" sahibi olursunuz ve bunları ayrı ayrı şu şekilde alabilirsiniz:

string[x]

xHangi "Merhaba" istediğinizi nerede belirleyeceksiniz?

Yani print(string[1])yazdırırdı Hello.


1
Bazı dillerden farklı olarak, bir Python listesindeki henüz mevcut olmayan öğelere atayamazsınız ("aralık dışı liste atama dizini" hatası alırsınız). Bunun string.append("Hello")yerine kullanmak isteyebilirsiniz .
Greg Hewgill,

1
Bunu bilmeliydim, hatırlattığın için teşekkürler. Tamir oldu.
Lledargo

Haklısın, bir dizinin sonuna eklemeyi düşünüyordum, bir diziye eklemeyi değil. Herkesten özür dilerim.
Lledargo

Uysalca '9 kez "Merhaba" olacaktı "," 9 kez 1 "Merhaba" olacaktı ". Dokuz farklı dizi değil, tekrarlanan aynı dizedir.
Duncan

2

Sanırım buradaki zorluk, global ()

Kişisel olarak (dinamik) değişkenleriniz için bir liste tanımlıyorum ve sonra bir for döngüsü içinde buna ekliyorum. Ardından, her girişi görüntülemek ve hatta diğer işlemleri yürütmek için ayrı bir for döngüsü kullanın.

İşte bir örnek - Çeşitli BRanches'de bir dizi ağ anahtarım (2 ile 8 arasında diyelim) var. Şimdi, herhangi bir şubede kaç tane anahtarın (veya canlı - ping testi) bulunduğunu belirleme ve sonra bunlar üzerinde bazı işlemler gerçekleştirme konusunda bir yolum olduğundan emin olmam gerekiyor.

İşte kodum:

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()

Çıktı:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

Sözlük kullanmak, değişkenleri ve ilişkili değerleri korumanın doğru yolu olmalıdır ve bunu kullanabilirsiniz:

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

Ancak değişkenleri yerel değişkenlere eklemek istiyorsanız, şunları kullanabilirsiniz:

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

Örneğin bunlara 0 - 8 arası değerler atamak istiyorsanız, şunu kullanabilirsiniz:

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

0

Sözlük değerler içerebilir ve değerler update () yöntemi kullanılarak eklenebilir. Sisteminizin değişkenler yaratmasını istiyorsunuz, bu yüzden nerede tutacağınızı bilmelisiniz.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.