python - 'জন্য' loops ব্যবহার করে অভিধান overterating




python-2.7 dictionary (8)

'জন্য' loops ব্যবহার করে অভিধান overterating

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    ...

কিভাবে পাইথন স্বীকার করে যে এটি শুধুমাত্র অভিধান থেকে কী পড়তে হবে? কী পাইথন একটি বিশেষ শব্দ? নাকি এটি কেবল একটি পরিবর্তনশীল?

এটা শুধু loops for নয়। এখানে গুরুত্বপূর্ণ শব্দ "পুনরাবৃত্তি" হয়।

একটি অভিধান মূল্যের কীগুলির একটি ম্যাপিং হয়:

d = {'x': 1, 'y': 2, 'z': 3} 

যে কোন সময় আমরা এটি পুনরাবৃত্তি, আমরা কী উপর পুনরাবৃত্তি। পরিবর্তনশীল নাম key শুধুমাত্র বর্ণনামূলক হতে অনুমিত হয় - এবং এটি উদ্দেশ্যটির জন্য বেশ উপযুক্ত।

এই একটি তালিকা বোঝার মধ্যে ঘটবে:

>>> [k for k in d]
['x', 'y', 'z']

যখন আমরা অভিধানটি তালিকাভুক্ত করতে (বা অন্য কোন সংগ্রহের ধরন বস্তু) এটি ঘটে তখন:

>>> list(d)
['x', 'y', 'z']

পাইথনটি পুনরাবৃত্তি করার পদ্ধতিটি, যেখানে এটি প্রয়োজন সেখানে একটি প্রসঙ্গে, এটি বস্তুর __iter__ পদ্ধতিটি কল করে (এই ক্ষেত্রে __iter__ ) যা একটি ইটারেটর প্রদান করে (এই ক্ষেত্রে একটি কীটাইটার অবজেক্ট):

>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>

আমাদের নিজেদের এই বিশেষ পদ্ধতিগুলি ব্যবহার করা উচিত নয়, পরিবর্তে, এটিকে কল করতে সংশ্লিষ্ট অন্তর্নির্মিত ফাংশনটি ব্যবহার করুন, iter :

>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>

Iterators একটি __next__ পদ্ধতি আছে - কিন্তু আমরা __next__ ফাংশন দিয়ে এটি কল, next :

>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

যখন একটি থুতু নিষ্কাশন করা হয়, এটি StopIteration উত্থাপন করে। পাইথন লুপ, বা একটি তালিকা বোঝার জন্য, অথবা একটি জেনারেটর এক্সপ্রেশন, বা অন্য কোন পুনরাবৃত্তিমূলক প্রেক্ষাপট থেকে প্রস্থান করতে জানেন। একবার একটি ইটারেটর StopIteration ইটারেশন উত্থাপন করলে এটি সর্বদা এটি বাড়াবে - যদি আপনি আবার পুনরাবৃত্তি করতে চান তবে আপনাকে একটি নতুন প্রয়োজন।

>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']

Dicts ফিরে

আমরা অনেক প্রসঙ্গে পুনরাবৃত্তি dicts দেখেছি। আমরা যা দেখেছি তা হল যে যেকোনো সময় আমরা একটি স্বর উপর পুনরাবৃত্তি করি, আমরা কীগুলি পাই। মূল উদাহরণ ফিরে:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:

আমরা পরিবর্তনশীল নাম পরিবর্তন, আমরা এখনও কি পেতে। চল এটা চেষ্টা করি:

>>> for each_key in d:
...     print(each_key, '=>', d[each_key])
... 
x => 1
y => 2
z => 3

আমরা যদি মানগুলির উপর পুনরাবৃত্তি করতে চাই, তাহলে আমাদের .values পদ্ধতিটি ব্যবহার করতে হবে, অথবা উভয় একসাথে, .items :

>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]

প্রদত্ত উদাহরণে, এর মতো আইটেমগুলির উপর পুনরাবৃত্তি করা আরও কার্যকর হবে:

for a_key, corresponding_value in d.items():
    print(a_key, corresponding_value)

কিন্তু একাডেমিক উদ্দেশ্যে, প্রশ্ন এর উদাহরণ ঠিক সূক্ষ্ম।

আমি নিম্নলিখিত কোড দ্বারা একটু বিভ্রান্ত করছি:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

আমি কি বুঝতে পারছি না key অংশ। কিভাবে পাইথন স্বীকার করে যে এটি শুধুমাত্র অভিধান থেকে কী পড়তে হবে? key পাইথন একটি বিশেষ শব্দ? নাকি এটি কেবল একটি পরিবর্তনশীল?


আপনি GitHub উপর dicttype এর dicttype বাস্তবায়ন চেক করতে পারেন। এটি পদ্ধতির স্বাক্ষর যা dictator এর প্রয়োগ প্রয়োগ করে:

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
             PyObject **pvalue, Py_hash_t *phash)

CPython dictobject.c


আমি একটি ব্যবহার ক্ষেত্রে যেখানে আমি কী, মান জোড়া, পেতে নির্দেশ মাধ্যমে পুনরাবৃত্তি করতে হবে সূচক এছাড়াও যেখানে আমি নির্দেশ করে। এইভাবে আমি এটা করি:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

মনে রাখবেন যে কীটির চারপাশে বন্ধনী, মানটি গুরুত্বপূর্ণ, বন্ধনী ছাড়া, আপনি একটি ValueError "আনপ্যাক করার জন্য পর্যাপ্ত মান না" পাবেন।



কীগুলির উপর পুনরাবৃত্তি করার জন্য, এটি ধীর হলেও my_dict.keys() ব্যবহার করতে ভাল। আপনি যদি এমন কিছু করার চেষ্টা করেন:

for key in my_dict:
    my_dict[key+"-1"] = my_dict[key]-1

এটি একটি রানটাইম ত্রুটি তৈরি করবে কারণ প্রোগ্রাম চলাকালীন আপনি কীগুলি পরিবর্তন করছেন। আপনি যদি সময় হ্রাস করার জন্য একেবারে সেট করেন তবে for key in my_dict ভাবে for key in my_dict ব্যবহার করুন, তবে আপনাকে সতর্ক করা হয়েছে;)।


কোনও নির্দেশের উপর কোনও বিশেষ আদেশে তার কীগুলির মাধ্যমে পুনরাবৃত্তি করা হয়, যেমন আপনি এখানে দেখতে পারেন:

সম্পাদনা করুন: ( Python3.6 এটি আর নেই তবে মনে রাখবেন যে এটি এখনও নিশ্চিত আচরণ নয় )

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

আপনার উদাহরণের জন্য, dict.items() ব্যবহার করার জন্য এটি একটি ভাল ধারণা:

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

এটি আপনাকে tuples একটি তালিকা দেয়। যখন আপনি তাদের মত লুপ করেন, তখন প্রতিটি টিপল স্বয়ংক্রিয়ভাবে k এবং v আনপ্যাক করা হয়:

for k,v in d.items():
    print(k, 'corresponds to', v)

লুপের শরীর শুধুমাত্র কয়েকটি লাইন থাকলে একটি dict উপর looping যখন পরিবর্তনশীল নাম হিসাবে k এবং v ব্যবহার করা খুবই সাধারণ। আরও জটিল লুপের জন্য আরো বর্ণনামূলক নাম ব্যবহার করা একটি ভাল ধারণা হতে পারে:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

বিন্যাস স্ট্রিংগুলি ব্যবহার করার অভ্যাস পেতে এটি একটি ভাল ধারণা:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

key কেবল একটি পরিবর্তনশীল।

Python2.X এর জন্য :

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... বা ভাল,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Python3.X এর জন্য :

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

key শুধু একটি পরিবর্তনশীল নাম।

for key in d:

কী এবং মূল্যের পরিবর্তে অভিধানে কীগুলি কেবল লুপ করবে। কী এবং মান উভয় উপর লুপ করার জন্য আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

পাইথন 2.x জন্য:

for key, value in d.iteritems():

পাইথন 3.x জন্য:

for key, value in d.items():

নিজের জন্য পরীক্ষা করতে, শব্দটি key poop পরিবর্তন করুন।

পাইথন 3.x এর জন্য, iteritems() কেবল items() দ্বারা প্রতিস্থাপিত হয়েছে, যা iteritems() মত iteritems() সেটটি ফেরত দেয়, যেমন iteritems() তবে আরও ভাল। এটি 2.7 হিসাবে viewitems()

অপারেশন items() 2 items() 3 এবং 3 উভয়ের জন্য কাজ করবে, তবে 2 এর মধ্যে এটি অভিধানের (key, value) জোড়াগুলির একটি তালিকা প্রদান করবে, যা items() কলের পরে ঘটবে এমন সংকেতগুলিতে পরিবর্তনগুলি প্রতিফলিত করবে না। আপনি 3.x এ 2.x আচরণ চান, আপনি list(d.items()) কল করতে পারেন list(d.items())





dictionary