লুপে থাকা অবস্থায় আপনি কীভাবে বিভিন্ন পরিবর্তনশীল নাম তৈরি করবেন? [প্রতিলিপি]


125

উদাহরণস্বরূপ ...

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

সুতরাং আমি স্ট্রিং 1, স্ট্রিং 2, স্ট্রিং 3 দিয়ে শেষ করছি ... সমস্ত "হ্যালো" সমান


34
উত্তরটি হ'ল আপনি এটি করতে চান না। পরিবর্তে একটি তালিকা ব্যবহার করুন।
সোভেন মারনাচ

2
x = ["Hello" * 9]এটি x[0], x[1] ...যদি আপনি এটি ব্যবহার করতে চান তবে এটির মাধ্যমে এটি অ্যাক্সেস করতে পারবেন আপনি যদি অন্যভাবে এটি ব্যবহার করতে চান তবে আমার মনে হয় আপনাকে আমাদের আরও কিছু কোড ব্যাকগ্রাউন্ড দিতে হবে।
জেমস খুরি

3
যদি আমার কোনও ভাষাতে যদি কখনও ক্ষমতা থাকে তবে পরিবর্তনশীল নামগুলির সাথে সংখ্যার ব্যবহার করে SyntaxError: Use a data structure.;-) দেবে
জোচেন রিটজেল

1
এবং আপনার string0 ভুলবেন না;)
Wim

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

তবে এটি খারাপ অভ্যাস। পরিবর্তে আপনার অভিধান বা তালিকা ব্যবহার করা উচিত, অন্যরা প্রস্তাব দেয় others অবশ্যই, যদি না আপনি অবশ্যই এটি করতে চান তা জানতে চেয়েছিলেন তবে এটি ব্যবহার করতে চান নি did


2
কেন আপনি এটি খারাপ ধারণা তা বিস্তারিত বলতে পারেন?
আজদিগ্রেগোরিও

6
@ পেইন্টকনকোনস: প্রথমে এটি করার একটি উপায় থাকতে হবে এবং সহজ অভিধান ব্যবহার করা আরও স্বাভাবিক। পরিবর্তে গ্লোবাল অভিধান ব্যবহার করা একটি খারাপ ধারণা, কারণ এটি "স্পষ্টতই" বৈশ্বিক পরিবর্তনশীলগুলি তৈরি করে বা তাদের পরিবর্তন করে। যেহেতু উভয় সেটিং এবং ভেরিয়েবল পরিবর্তন এই ভাবে স্বরলিপি অভিধান প্রয়োজন, সেখানে ব্যবহার করার কোনও কারণ নেই globals()কিছু সহজ পরিবর্তে dict
টেডেক

কয়েকটি পরিস্থিতি যখন আপনাকে ভেরিয়েবল, এক্স 1, এক্স 2, এক্স 3 ইত্যাদির প্রয়োজন হয় তবে বেশিরভাগ পরিস্থিতিতে ডিকশনারি ব্যবহার করা সর্বাধিক উপযুক্ত জিনিস।
ডেভিল অ্যাপল 227

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+ এ হ্যান্ডি এফ স্ট্রিং ফর্ম্যাটিংয়ের সুবিধা নিচ্ছি


5
execকিছু, কালো যাদু, আক্রমণ দুর্বলতা, খারাপ জিনিস মনে রাখবেন , তবে এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয়।
psaxton

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.