2009-11-23 68 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 2009-11-23 00:42:41

+0

返回self.books.itervalues()比返回iter(self.books.values())更好嗎?我覺得這是一個字典特定的便利方法,並且很驚訝地發現它返回一個'dictionary-valueiterator'對象,而另一個返回'listiterator'。不過,同樣的結果。 – 2014-12-02 20:12:49

4

這種方法添加到媒體庫:

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

這代表迭代的字典,它有一個簡單的方法來迭代值。閱讀迭代器協議,該協議由__iter__(在所有迭代器中)和next(在3.x中的__next__)(僅在迭代器上)組成。

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()返回一個迭代的字典的值。

如果你想要更多的控制,可以使__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__

相關問題