पायथन में एक शब्दकोश में पुनरावृति होने पर आपको .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

मेरा अनुमान है: पूर्ण टपल का उपयोग लूपिंग के लिए अधिक सहज होगा, लेकिन सदस्यता के उपयोग के लिए परीक्षण के लिए शायद इतना कम 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कुछ बिंदु पर, मैं कहूँगा कि यह एक बहुत ही होगा विशाल विसंगति।
अनारोस्टरलिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.