2012-03-26 8 views
113

संभव डुप्लिकेट:
What are “named tuples” in Python?मुझे कब और क्यों एक शब्दकोश के बजाय नामांकित का उपयोग करना चाहिए?

स्थिति है जहाँ एक namedtuple इस्तेमाल किया जाना चाहिए क्या है?

जब मैंने इसे देखा, तो यह टुपल को शब्दकोशों की तरह अधिक बनाने का तरीका दिखता था। वे शब्दकोशों की तुलना कैसे करते हैं?

क्या नामों के लिए शब्दकोशों के लिए केवल वही हैशबल प्रकारों का उपयोग किया जा सकता है?

+0

इस प्रश्न पर एक नज़र डालें - http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python – ronakg

+0

यह [ऊपर वर्णित प्रश्न] का एक डुप्लिकेट नहीं है (https://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python)। दोनों पूरक हैं। – Dennis

उत्तर

156

dict एस में, केवल चाबियों को हेशेबल होना चाहिए, मान नहीं। namedtuple के पास कुंजी नहीं है, इसलिए हैशबिलिटी कोई समस्या नहीं है।

हालांकि, उनके पास एक और अधिक कठोर प्रतिबंध है - उनके मुख्य समकक्ष, "फ़ील्ड नाम", तार होना चाहिए।

मूल रूप से, अगर आप एक वर्ग की तरह के उदाहरण के एक झुंड बनाने के लिए जा रहे थे: आप उन्हें __init__ में सेट करने के बाद

class Container: 
    def __init__(self, name, date, foo, bar): 
     self.name = name 
     self.date = date 
     self.foo = foo 
     self.bar = bar 

mycontainer = Container(name, date, foo, bar) 

और विशेषताओं को बदल नहीं, आप के बजाय इस्तेमाल कर सकते हैं

Container = namedtuple('Container', ['name', 'date', 'foo', 'bar']) 

mycontainer = Container(name, date, foo, bar) 
प्रतिस्थापन के रूप में

बेशक

, आप dict रों जहां हर एक में एक ही चाबी इस्तेमाल किया जाता का एक समूह बनाने के लिए, लेकिन यह सोचते हैं आप कुंजी के रूप में ही मान्य अजगर पहचानकर्ता है और अस्थिरता की जरूरत नहीं है सकते हैं,

mynamedtuple.fieldname 

खूबसूरत से

mydict['fieldname'] 

और

mynamedtuple = MyNamedTuple(firstvalue, secondvalue) 

खूबसूरत है

mydict = {'fieldname': firstvalue, 'secondfield': secondvalue} 

अंत में, namedtuple रों आदेश दिया जाता है, नियमित रूप से dict रों के विपरीत है, तो आप आपको क्षेत्रों में परिभाषित किया गया है, एक dict विपरीत में आइटम प्राप्त की तुलना में।

+16

इसके अलावा, रेमंड को उद्धृत करते हुए: "नामित टुपल्स के उदाहरण नियमित टुपल्स की तुलना में और अधिक जगह का उपयोग नहीं करते हैं। फ़ील्ड नाम गुण नामित वर्ग में संग्रहीत होते हैं।" https: // चहचहाना।कॉम/रेमंड/स्थिति/524660721968107521 – Moberg

+0

ध्यान देने योग्य एक और बात यह है कि नामित टुपल को 'mynamedtuple = MyNamedTuple (fieldname = firstvalue, secondfield = secondvalue) के रूप में भी प्रारंभ किया जा सकता है। –

26

टुपल्स अपरिवर्तनीय हैं, चाहे नामित हों या नहीं। namedtuple केवल सूचकांक के बजाय नामों का उपयोग करके, अधिक सुविधाजनक पहुंच बनाता है। आप केवल namedtuple के लिए मान्य पहचानकर्ता का उपयोग कर सकते हैं, यह किसी भी हैशिंग नहीं करता है - यह इसके बजाय एक नया प्रकार उत्पन्न करता है।

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