2009-11-23 15 views
14

मेरे पास एक शब्दकोश के साथ एक ऑब्जेक्ट है जिसे मैं __getitem__ के साथ-साथ फिर से चालू करना चाहता हूं (केवल मान, चाबियाँ कोई फर्क नहीं पड़ता) लेकिन मुझे यकीन नहीं है कि यह कैसे करें।मैं __getitem__ और __iter__ का उपयोग कैसे करूं और शब्दकोश से मूल्य वापस कर सकता हूं?

उदाहरण के लिए:

Python 2.5.2 (r252:60911, Jul 22 2009, 15:33:10) 
>>> class Library(object): 
... def __init__(self): 
...  self.books = { 'title' : object, 'title2' : object, 'title3' : object, } 
... def __getitem__(self, i): 
...  return self.books[i] 
... 
>>> library = Library() 
>>> library['title'] 
<type 'object'> 
>>> for book in library: 
... print book 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in __getitem__ 
KeyError: 0 
>>> 

मैं इसे कैसे बताऊँ बस शब्दकोश में प्रत्येक आइटम के लिए object वापस जाने के लिए (कुंजी कोई फर्क नहीं पड़ता)?

उत्तर

22
def __iter__(self): return self.books.itervalues() 
+0

धन्यवाद - मुझे पता था कि यह कुछ आसान था लेकिन उसे ट्रैक करने में सबसे कठिन समय था! इसकी प्रशंसा करना। – thornomad

+0

'रिटर्न इटार (self.books.values ​​())' से बेहतर 'book.its.itervalues ​​() 'बेहतर है? मुझे लगा कि यह एक शब्दकोश-विशिष्ट सुविधा विधि थी और यह जानकर आश्चर्यचकित हुआ कि यह 'डिक्शनरी-वैलिटरेटर' ऑब्जेक्ट देता है, जबकि दूसरा 'लिस्टिटरेटर' देता है। हालांकि, वही अंतिम परिणाम। –

4

लाइब्रेरी के लिए इस विधि जोड़ें:

def __iter__(self): 
    return self.books.itervalues() 

dict, जो मूल्यों पुनरावृति के लिए एक आसान विधि है करने के लिए इस प्रतिनिधियों यात्रा। इटरेटर प्रोटोकॉल के बारे में पढ़ें, जिसमें __iter__ (सभी पुनरावृत्तियों पर) और next (__next__ 3.x में) (केवल इटरेटर पर) विधियां शामिल हैं।

2
>>> class Library(object): 
...  def __init__(self):              
...    self.books = { 'title' : object, 'title2' : object, 'title3' : object, } 
...  def __getitem__(self, i): 
...    return self.books[i] 
...  def __iter__(self): 
...    return self.books.itervalues() 
... 
>>> library = Library() 
>>> library['title'] 
<type 'object'> 
>>> for book in library: 
...  print book 
... 
<type 'object'> 
<type 'object'> 
<type 'object'> 
2

आप अपने भीतर के डेटा से पुनरावर्तक लौट सकते हैं:

class Library (object): 
    ... 
    def __iter__(self): 
    return self.books.itervalues() 

itervalues() शब्दकोश के मूल्यों के लिए एक iterator देता है।

आप अधिक नियंत्रण चाहते हैं, तो आप __iter__ कर सकते हैं एक जनरेटर समारोह

class Library (object): 
    ... 
    def __iter__(self): 
    for title in self.books: 
     yield self.books[title] 
इस मामले में

, इस जनरेटर पहले उदाहरण में इटरेटर के रूप में ठीक उसी अर्जित करता है।

0

__getitem__(self,key), जहां कुंजी एक पूर्णांक है, अपने self.books के रूप में एक शब्दकोश है और आप ऐसा नहीं कर सकते self.books[integer]

जैसे:

:

>>>d = {'a':'sdsdsd','b':'sfsdsd'} 
>>d[0] 

d[0] 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
KeyError: 0 

यात्रा प्रोटोकॉल इस प्रकार है इटरेटर प्रोटोकॉल में दो विधियां होती हैं। __iter__() विधि, जो इटेटरेटर ऑब्जेक्ट और next() विधि को वापस करनी होगी, जो अनुक्रम से अगला तत्व लौटाती है। पहले जब __iter__ विधि परिभाषित नहीं की गई थी, तो __getitem__ पर __getitem__ पर लगातार बढ़कर __getitem__ पर कॉल करके बढ़ती हुई मानों के साथ यह सूचकांक रेंज त्रुटि से बाहर निकलता है।

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

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