পাইথনের কোনও অভিধানে পুনরাবৃত্তি করার সময় আপনাকে কেন .items () কল করতে হবে?


131

আপনাকে items()অভিধানে কী, মান জোড়ের উপরে পুনরাবৃত্তি করতে কল করতে হবে কেন ? অর্থাত।

dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
    print(k, v)

কেন এটি কোনও অভিধানে পুনরাবৃত্তি হওয়ার ডিফল্ট আচরণ নয়

for k, v in dic:
    print(k, v)

উত্তর:


171

প্রতিটি অজগর ধারক সি এর জন্য প্রত্যাশাটি এটি

for item in C:
    assert item in C

ঠিক জরিমানা পাস করবে - আপনি কি অবাক করে দেখবেন না যদি in(লুপ ক্লজ) এর একটি বোধের অন্যটির (উপস্থিতি চেক) থেকে সম্পূর্ণ আলাদা অর্থ হয়? আমি নিশ্চিত! এটি স্বাভাবিকভাবে তালিকা, সেট, টিপলস, ...

সুতরাং, অভিধানটি কখন C, inকোনও forলুপে কী / মান টিপলস সরবরাহ করতে হয় , তারপরে, অন্তত বিস্ময়ের নীতি অনুসারে, inকনটেন্টমেন্ট চেকটিতে তার বাম-হাতের ক্রিয়াকলাপ হিসাবে একটি টুপল নিতে হবে।

এটা কিভাবে দরকারী হবে? বেশ বেহুদা প্রকৃতপক্ষে, মূলত উপার্জন if (key, value) in Cজন্য একটি প্রতিশব্দ if C.get(key) == value- যা একটি চেক আমি বিশ্বাস করি আমি সম্পাদিত হয়েছে পারে, অথবা সম্পাদন করতে চেয়েছিলাম, 100 গুণ বেশি খুব কমই কি আর if k in Cআসলে মানে , কী উপস্থিতি চেক শুধুমাত্র এবং সম্পূর্ণরূপে মান উপেক্ষা।

অন্যদিকে, কেবল কীগুলিতে লুপ করতে চাওয়া বেশ সাধারণ, যেমন:

for k in thedict:
    thedict[k] += 1

পাশাপাশি মান রাখলে বিশেষত সহায়তা হয় না:

for k, v in thedict.items():
    thedict[k] = v + 1

আসলে কিছুটা কম পরিষ্কার এবং কম সংক্ষিপ্ত। (মনে রাখবেন itemsকী / মান জোড়া পেতে "যথাযথ" পদ্ধতির মূল বানানটি ছিল: দুর্ভাগ্যক্রমে সেই দিনগুলিতে ফিরে এসেছিল যখন এই ধরণের অ্যাক্সেসররা পুরো তালিকাগুলি ফিরিয়ে দেয়, তাই "কেবল পুনরাবৃত্তি" সমর্থন করার জন্য একটি বিকল্প বানান প্রবর্তন করতে হয়েছিল , এবং iteritems এটি ছিল - পাইথন 3-তে, যেখানে পূর্ববর্তী পাইথন সংস্করণগুলির সাথে পিছনের দিকে সামঞ্জস্যতার সীমাবদ্ধতাগুলি অনেক দুর্বল হয়ে গিয়েছিল, এটি itemsআবার হয়ে গেছে )।


10

আমার অনুমান: পূর্ণ tuple ব্যবহার লুপিং জন্য আরও বেশি ধারণাসম্পন্ন হতে পারে, কিন্তু সম্ভবত সদস্যপদের জন্য পরীক্ষা ব্যবহার করার জন্য, যাতে কম in

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

যদি আপনার কী এবং মান উভয়ই নির্দিষ্ট করতে হয় তবে সেই কোডটি আসলে কাজ করবে না in। ব্যবহারের ক্ষেত্রে কল্পনা করার ক্ষেত্রে আমার খুব কষ্ট হচ্ছে, যেখানে আপনি কী এবং মান উভয়ই অভিধানে রেখেছেন কিনা তা পরীক্ষা করে দেখতে চান। কেবল কীগুলি পরীক্ষা করা এটি অনেক বেশি প্রাকৃতিক।

# When would you ever write a condition like this?
if (key, value) in dict:

এখন inঅপারেটর এবং for ... inএকই আইটেমগুলির উপর পরিচালনা করা প্রয়োজন হয় না। বাস্তবায়ন-ভিত্তিতে তারা বিভিন্ন অপারেশন ( __contains__বনাম __iter__)। তবে এই সামান্য অসঙ্গতি কিছুটা বিভ্রান্তিকর এবং, ভাল, বেমানান হবে।


যে জন্য দেওয়া যে এর iterable builtin আমি মনে করতে পারেন যে, অন্য ধরনের x in fooশুধুমাত্র যদি iমধ্যে for i in fooমান অনুমান xএক পর্যায়ে আমি বলতে হবে যে এটি একটি খুব হবে বিশাল অসঙ্গতি।
অ্যারোনস্টার্লিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.