'For' লুপগুলি ব্যবহার করে অভিধানে আইট্রেট করা


3134

আমি নিম্নলিখিত কোডটি দেখে কিছুটা হতবাক:

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

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


2
আপনি একটি নতুন উত্তর পোস্ট করার আগে, এই প্রশ্নের ইতিমধ্যে 10+ উত্তর আছে তা বিবেচনা করুন। দয়া করে নিশ্চিত হন যে আপনার উত্তরটি এমন তথ্যের অবদান রাখে যা বিদ্যমান উত্তরের মধ্যে নেই।
জান্নিকস

উত্তর:


5386

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

for key in d:

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

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

for key, value in d.items():

পাইথন ২.x এর জন্য:

for key, value in d.iteritems():

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

পাইথন ৩.x-এ, iteritems()সরলভাবে প্রতিস্থাপন করা হয়েছিল items(), যা ডিকের সাহায্যে সেট-মতো দৃশ্যের মতো, iteritems()তবে আরও ভাল returns এটি 2.7 হিসাবে উপলব্ধ viewitems()

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


157
এর মতো মান অ্যাক্সেস না করার জন্য একটি উপেক্ষিত কারণ যুক্ত করা: লুপের ভিতরে ডি [কী] পুনরায় চাবিটি হ্যাশ করার কারণ হয় (মান পেতে)। অভিধানটি বড় হলে এই অতিরিক্ত হ্যাশ সামগ্রিক সময়ে যুক্ত হবে। এটি রেমন্ড
হেটিংজারের

27
আইটেমগুলি অনির্দেশ্য ক্রমে পুনরাবৃত্তি হবে এবং sortedএটি স্থিতিশীল করা প্রয়োজন উল্লেখ করতে পারে।

5
@ হারিসঙ্করকৃষ্ণস্বামী বিকল্প কি?
জোয়েসি

3
@ ইউগার আপনি এটাকে কেন বলছেন? দস্তাবেজগুলি বলছে Keys and values are iterated over in insertion order. [ ডকস.পিথন.আর.৩ / ৩
গেজা তুরি

4
পাইথন ৩.7 থেকে ইউগার, অভিধানগুলি সন্নিবেশ-অর্ডার করা হয় এবং এটি একটি ভাষা বৈশিষ্ট্য। দেখুন stackoverflow.com/a/39980744/9428564
Aimery

431

এটি মূল কীটি বিশেষ শব্দ নয়, তবে সেই অভিধানগুলি পুনরাবৃত্তকারী প্রোটোকল প্রয়োগ করে। আপনি আপনার ক্লাসে এটি করতে পারেন, উদাহরণস্বরূপ শ্রেণি পুনরাবৃত্তিগুলি কীভাবে তৈরি করবেন এই প্রশ্নটি দেখুন ।

অভিধানের ক্ষেত্রে এটি সি স্তরে প্রয়োগ করা হয়। বিশদটি পিইপি 234 এ উপলব্ধ । বিশেষত, "অভিধান আইট্রেটরস" শিরোনামে বিভাগটি:

  • অভিধানগুলি একটি টিপি_মিটার স্লট প্রয়োগ করে যা একটি দক্ষ পুনরাবৃত্তিকে প্রদান করে যা অভিধানের কীগুলির উপর দিয়ে পুনরাবৃত্তি করে। [...] এর অর্থ আমরা লিখতে পারি

    for k in dict: ...

    যা এর সমান, তবে এর চেয়ে অনেক দ্রুত

    for k in dict.keys(): ...

    যতক্ষণ অভিধানে পরিবর্তনের উপর বিধিনিষেধ লঙ্ঘন করা হয় না (লুপ দ্বারা বা অন্য থ্রেড দ্বারা)।

  • অভিধানে এমন পদ্ধতি যুক্ত করুন যা বিভিন্ন ধরণের পুনরাবৃত্তিকে স্পষ্টতই ফিরে আসে:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...

    এর অর্থ এই যে for x in dictজন্য সাধারণভাবে সংক্ষেপে হয় for x in dict.iterkeys()

পাইথন 3 সালে dict.iterkeys(), dict.itervalues()এবং dict.iteritems()আর সমর্থিত। ব্যবহারের dict.keys(), dict.values()এবং dict.items()পরিবর্তে।


207

ওভার আইট্রেটিং a 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)]

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

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

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

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

11
পাইথন ৩.7 রিলিজ নোট থেকে: "ডিক বস্তুর সন্নিবেশ-আদেশ সংরক্ষণের প্রকৃতি এখন পাইথন ল্যাঙ্গুয়েজ অনুমানের একটি সরকারী অংশ part"
গ্রেগরি অ্যারেনিয়াস

86

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)

62

আপনি যখন- for .. in ..সিনট্যাক্স ব্যবহার করে অভিধানের মাধ্যমে পুনরাবৃত্তি করেন, এটি সর্বদা কীগুলির মাধ্যমে পুনরাবৃত্তি করে (মানগুলি ব্যবহার করে অ্যাক্সেসযোগ্য dictionary[key])।

কী-মান জোড়ায় পুনরাবৃত্তি করতে পাইথন 2 ব্যবহারে for k,v in s.iteritems()এবং পাইথন 3 এ for k,v in s.items()


38
দ্রষ্টব্য যে পাইথন 3 এর items()পরিবর্তে এটি হলiteritems()
এন্ড্রেয় ফেস্টার

32

এটি একটি খুব সাধারণ লুপিং প্রতিমা। inএকটি অপারেটর। যখন ব্যবহার করতে for key in dictএবং এটি করা আবশ্যক for key in dict.keys()দেখতে ডেভিড Goodger এর কথ্য পাইথন নিবন্ধ (সংরক্ষন অনুলিপি)


আমি এই বিভাগগুলি সম্পর্কে যেমন পড়ি in, অপারেটর অংশটিই আপনি অস্তিত্বের জন্য যাচাই করেন । আরও ভাল এই in is an operatorতথ্য মুছুন ।
ওল্ফ

19

'For' লুপগুলি ব্যবহার করে অভিধানে আইট্রেট করা

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

পাইথন কীভাবে চিনতে পারে যে অভিধান থেকে কীটি পড়ার জন্য এটির প্রয়োজন? পাইথনের কী কী বিশেষ শব্দ? অথবা এটি কেবল একটি পরিবর্তনশীল?

এটা ঠিক না for লুপস নয়। এখানে গুরুত্বপূর্ণ শব্দটি হ'ল "পুনরাবৃত্তি"।

অভিধান হ'ল মানগুলির কীগুলির ম্যাপিং:

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

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

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

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

যখন আমরা তালিকাটি অভিধানে পাস করি (বা অন্য কোনও সংগ্রহের ধরণের অবজেক্ট):

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

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

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

আমরা এই বিশেষ পদ্ধতি ব্যবহার করা উচিত নয় নিজেদেরকে পরিবর্তে, একে ডাকতে নিজ নিজ builtin ফাংশন ব্যবহার, iter:

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

আইট্রেটারদের একটি __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। পাইথন এইভাবে কোনও forলুপ, বা একটি তালিকা উপলব্ধি, বা একটি জেনারেটর এক্সপ্রেশন, বা অন্য কোনও পুনরাবৃত্ত প্রসঙ্গে প্রস্থান করতে জানে । একবার কোনও StopIterationপুনরাবৃত্তি উত্থাপিত হলে এটি সর্বদা এটি উত্থাপন করবে - আপনি যদি আবার পুনরাবৃত্তি করতে চান তবে আপনার একটি নতুন দরকার।

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

ডিক্টসে ফিরছে

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

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)

তবে একাডেমিক উদ্দেশ্যে, প্রশ্নের উদাহরণটি ঠিক আছে।


17

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

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

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


1
এটি প্রশ্নের সাথে কীভাবে প্রাসঙ্গিক?
জুরিজনসিত

8

আপনি dicttypeগিটহাবে সিপিথনের বাস্তবায়ন পরীক্ষা করতে পারেন । এটি সেই পদ্ধতির স্বাক্ষর যা ডিকটি পুনরায় প্রয়োগকারীকে কার্যকর করে:

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

সিপিথন ডাইকটোজেক্ট.সি


4

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

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

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


2

এটি আউটমানিং ক্রমে মান অনুসারে বাছাই করা ক্রমে আউটপুট প্রিন্ট করবে।

d = {'x': 3, 'y': 1, 'z': 2}
def by_value(item):
    return item[1]

for key, value in sorted(d.items(), key=by_value):
    print(key, '->', value)

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন

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