एक लूप में रहते हुए आप विभिन्न चर नाम कैसे बनाते हैं? [डुप्लिकेट]


125

उदाहरण के उद्देश्यों के लिए ...

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

तो मैं string1, string2, string3 के साथ समाप्त करता हूं ... सभी "हैलो" की बराबरी कर रहा हूं


34
इसका उत्तर यह है कि आप ऐसा नहीं करना चाहते हैं। इसके बजाय एक सूची का उपयोग करें।
स्वेन मार्नाच

2
यदि यह वह जगह है जहाँ आप इसका उपयोग करना चाहते हैं, x = ["Hello" * 9]तो आप इसका उपयोग कर सकते हैं x[0], x[1] ...यदि आप इसे एक अलग तरीके से उपयोग करना चाहते हैं, तो मुझे लगता है कि आपको हमें कुछ और कोड पृष्ठभूमि देनी होगी।
जेम्स खुर्री

3
अगर मुझे कभी भाषा पर अधिकार है, तो चर नामों में संख्याओं का उपयोग करना SyntaxError: Use a data structure.;-)
जोचेन रिट्जेल

1
और अपने string0 मत भूलना;)
विम

10
@ जेम्स खुरे: यह बिल्कुल सही नहीं है। यह xएक सूची में एक तत्व से युक्त होने के साथ समाप्त होगा - स्ट्रिंग "हेलोहेलो हेलो हेलो हेलो हेलो हेलो हेलो"। मुझे लगता है कि आपका मतलब था 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
क्या आप इस बारे में विस्तार से बता सकते हैं कि यह एक बुरा विचार क्यों है?
अंजदिग्रेयोरियो

6
@paintedcones: सबसे पहले, इसे करने का एक तरीका होना चाहिए , और सरल शब्दकोशों का उपयोग करना अधिक स्वाभाविक है। इसके बजाय ग्लोबल्स शब्दकोश का उपयोग करना एक बुरा विचार है, क्योंकि यह "अनुमानित" वैश्विक चर बनाता है या उन्हें संशोधित करता है। चूँकि इस तरह से चर स्थापित और संशोधित करने के लिए शब्दकोश संकेतन की आवश्यकता होती है, इसलिए globals()कुछ सरल के बजाय उपयोग करने का कोई कारण नहीं है dict
ताडेक

जब आपको चर, X1, x2, x3, आदि का एक गुच्छा बनाने की आवश्यकता होती है, तो कुछ स्थितियां होती हैं, लेकिन अधिकांश स्थितियों में, शब्दकोश का उपयोग करना वास्तव में सबसे उपयुक्त बात है।
डेविलएपले २२22

20

एक तरीका है कि आप ऐसा कर सकते हैं 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

यहां मैं पायथन 3.6+ में आसान f स्ट्रिंग प्रारूपण का लाभ उठा रहा हूं


5
execकुछ याद रखें , काला जादू, कमजोरियों पर हमला, बुरी चीजें, लेकिन यह पूछे गए सवाल का जवाब देता है।
22

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

यह एक तानाशाही का उपयोग न करें

ग्लोबल्स () में जोखिम होता है क्योंकि यह आपको देता है कि नाम स्थान वर्तमान में क्या इंगित कर रहा है लेकिन यह बदल सकता है और इसलिए ग्लोबल्स से रिटर्न को संशोधित करना () एक अच्छा विचार नहीं है



3

मैं एक सूची का उपयोग करूंगा:

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

इस तरह, आपके पास 9 "हैलो" होंगे और आप उन्हें इस तरह से व्यक्तिगत रूप से प्राप्त कर सकते हैं:

string[x]

जहाँ xआप चाहते हैं कि "हैलो" की पहचान करेगा।

तो, print(string[1])प्रिंट होगा Hello


1
कुछ भाषाओं के विपरीत, आप पायथन सूची में उन तत्वों को निर्दिष्ट नहीं कर सकते हैं जो अभी तक मौजूद नहीं हैं (आपको "सूची असाइनमेंट इंडेक्स आउट ऑफ रेंज" त्रुटि मिलेगी)। आप string.append("Hello")इसके बजाय उपयोग करना चाह सकते हैं ।
ग्रेग हेविगिल

1
मुझे पता होना चाहिए था कि, मुझे याद दिलाने के लिए धन्यवाद। यह निश्चित है।
Lledargo

आपका अधिकार, मैं एक स्ट्रिंग के अंत में जोड़ने की सोच रहा था, एक सरणी में जोड़ने के लिए नहीं। सभी से मेरी क्षमा याचना।
Lledargo

पेडेंटली 'आपके पास 9 "हेलो" होना चाहिए "आपके पास 1" हैलो "9 बार होगा। यह एक ही तार दोहराया जाता है, न कि नौ अंतर तार।
डंकन

2

मुझे लगता है कि यहां चुनौती वैश्विक नहीं है ()

मैं व्यक्तिगत रूप से आपके (डायनामिक) वैरिएबल्स के लिए एक सूची निर्धारित करूँगा और फिर इसे लूप के लिए जोड़ दूंगा। फिर प्रत्येक प्रविष्टि को देखने के लिए एक लूप के लिए एक अलग उपयोग करें या यहां तक ​​कि अन्य संचालन को निष्पादित करें।

यहाँ एक उदाहरण है - मेरे पास विभिन्न ब्रांचों पर कई नेटवर्क स्विच हैं (2 और 8 के बीच)। अब मुझे यह सुनिश्चित करने की आवश्यकता है कि मेरे पास यह निर्धारित करने का एक तरीका है कि किसी भी शाखा में कितने स्विच उपलब्ध हैं (या जीवित - पिंग परीक्षण) और फिर उन पर कुछ ऑपरेशन करें।

यहाँ मेरा कोड है:

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

शब्दकोश में मान हो सकते हैं और अपडेट () पद्धति का उपयोग करके मान जोड़े जा सकते हैं। आप चाहते हैं कि आपका सिस्टम वैरिएबल बनाएं, इसलिए आपको पता होना चाहिए कि आपको कहां रखना है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.