2010-09-19 10 views
128

कुंजीपटल में मूल्य, मूल्य जोड़े में फिर से शुरू करने के लिए आपको iteritems() पर कॉल क्यों करना है? यानीआपको Python में एक शब्दकोश पर पुनरावृत्ति करते समय .iteritems() को कॉल क्यों करना है?

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

क्यों नहीं है कि एक शब्दकोश

for k, v in dic: 
    print k, v 
+39

+1 अच्छा सवाल। आइए देखते हैं कि एलेक्स को – NullUserException

उत्तर

168

हर अजगर कंटेनर सी के लिए, उम्मीद है कि

for item in C: 
    assert item in C 

ठीक पारित करेंगे है दूसरे से (उपस्थिति की जांच) का अर्थ है? मुझे यकीन है कि! यह स्वाभाविक रूप से, सूचियों, सेट, tuples के लिए उस तरह से काम करता है ...

तो, जब C एक शब्दकोश है, in एक for पाश में कुंजी/मान tuples उपज के लिए है, तो, कम से कम विस्मय के सिद्धांत के द्वारा थे, in को रोकथाम की जांच में बाएं हाथ के ऑपरेंड के रूप में भी ऐसा ट्यूपल लेना होगा।

यह कितना उपयोगी होगा? सुंदर वास्तव में बेकार, मूल रूप से if (key, value) in Cif 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 फिर से बन गई)।

+2

बहुत स्पष्ट स्पष्टीकरण। मुझे लगता है कि मुझे थोड़ा और अधिक पाइथन के 'हुड के नीचे' देखने की जरूरत है। X इन ऑपरेटरों के लिए 'इन' और 'अभी भी मेरे लिए जादू का थोड़ा सा है। – Falmarri

+0

@ फाल्मररी, मुझे एक वैचारिक स्तर पर व्याख्या करने में खुशी होगी (सी स्रोत में खोदने की कोई आवश्यकता नहीं है ;-) यदि आप इसके बारे में एक और सवाल पूछते हैं! -) –

+0

वैसे मैं एक सी ++ प्रोग्रामर हूं, इसलिए शायद सी में खोदना अधिक उपयोगी हो सकता है =] पाइथन काम में ऑपरेटर मेरे लिए थोड़ा सा अचूक है (कम से कम निम्न स्तर की समझ से)। – Falmarri

9

मेरा अनुमान से अधिक बार-बार दोहराना के डिफ़ॉल्ट व्यवहार किया जाता है: पूर्ण टपल का उपयोग करना अधिक सहज ज्ञान युक्त पाशन के लिए होगा, लेकिन शायद परीक्षण के लिए इतने कम 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__)। लेकिन वह छोटी असंगतता कुछ हद तक भ्रमित और अच्छी तरह से असंगत होगी। नहीं आप पाते हैं हैं यह आश्चर्यजनक है, तो in में से एक भावना (पाश खंड) एक पूरी तरह से अलग था -

+0

क्या कहना है कि _every_ अन्य प्रकार के बिल्टिन के लिए मैं सोच सकता हूं कि 'x in foo' केवल तभी' i 'में' i 'में' i' 'में कुछ बिंदु पर 'x' का मान मानता है , मैं कहूंगा कि यह एक बहुत ही __huge__ असंगतता होगी। – aaronasterling

संबंधित मुद्दे