代码之家  ›  专栏  ›  技术社区  ›  thornomad

如何使用getitem和iter并从字典返回值?

  •  14
  • thornomad  · 技术社区  · 15 年前

    我有一个带字典的对象,我想通过它访问 __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 回复  |  直到 7 年前
        1
  •  23
  •   Alex Martelli    15 年前
    def __iter__(self): return self.books.itervalues()
    
        2
  •  4
  •   Roger Pate    15 年前

    将此方法添加到库:

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

    这将迭代委托给dict,它有一个简单的方法来迭代值。了解迭代器协议,该协议由 __iter__ (在所有Iterables上)和 next ( __next__ 在3.x(仅限迭代器)方法中。

        3
  •  3
  •   glglgl John Dvorak    12 年前

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

    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]
    

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

        4
  •  2
  •   Jason Baker    15 年前
    >>> 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'>
    
        5
  •  0
  •   Suppressingfire    15 年前

    你考虑过使用 UserDict 混合蛋白?

        6
  •  0
  •   Paul Rooney    7 年前

    __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__ 通过连续呼叫 第二章 增加值,直到给出超出范围的索引。