如何使用__getitem__和__iter__并从字典中返回值?

时间:2009-11-23 00:35:15

标签: python iterator

我有一个带有字典的对象,我想通过__getitem__访问并迭代(仅限值,键无关紧要),但我不知道该怎么做。

例如:

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(关键无关紧要)?

6 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:4)

将此方法添加到库:

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

这会将迭代委托给dict,它有一个简单的方法来迭代值。阅读迭代器协议,它包含__iter__(在所有迭代中)和next(3.x中的__next__)(仅在迭代器上)方法。

答案 2 :(得分:3)

您可以从内部数据返回迭代器:

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]

在这种情况下,这个生成器产生的结果与第一个例子中的迭代器完全相同。

答案 3 :(得分: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'>

答案 4 :(得分:0)

您是否考虑过使用UserDict mixin?

答案 5 :(得分:0)

__getitem__(self,key),其中key是一个整数,因为你的self.books是一个字典而你不能self.books[integer]

e.g:

>>>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__