【问题标题】:Python iterable collection that wraps a dictionary包装字典的 Python 可迭代集合
【发布时间】:2017-05-30 00:45:48
【问题描述】:

我正在尝试修改以下代码,以便 MyCollection 将包装一个字典。我仍然需要实现 iternext 方法才能拥有“for element in collection”功能。我知道这可以通过迭代值来轻松完成,但我需要这样做。有人可以帮我吗?

class MyCollection:
    def __init__(self):
        self._data = []  // should be {}

    def __iter__(self):
            '''
        Return an iterator
        '''
        self._iterPoz = 0
        return self

    def __next__(self):
        '''
        Returns the next element of the iteration
        '''
        if self._iterPoz >= len(self._data):
            raise StopIteration()
        rez = self._data[self._iterPoz]
        self._iterPoz = self._iterPoz + 1
        return rez

【问题讨论】:

  • 如果您希望用户遍历内部数据,只需return iter(self._data)__iter__,然后您不需要提供__next__
  • @jonrsharpe - 好点,但看起来他想迭代值,而不是键,所以return iter(self._data.values())
  • 很难通过索引来做到这一点,因为 dicts 是按它们的名称索引的。您需要预先获取名称列表,但随后您冒着在迭代期间更改字典并提高KeyError 的风险。如果没有更多详细信息说明您为何有如此奇怪的限制以及该限制到底是什么,我认为我们无法回答这个问题。
  • @tdelaney 这是我的编程课项目的一部分。我的教授要求我有一个可迭代的数据结构,并向我展示了这个使用列表的示例。问题是,这个集合将用于一个更大的项目,该项目目前正在使用字典,所以它应该像一个一样工作,除了我将能够遍历它。
  • @SebastianGrigor - 您可以根据调用的子函数来迭代字典的键、值或键/值对。最大的问题是你想要迭代什么。如果它只是self._dict 的值,那么iter(self._data.values()) 就是你想要的。您可能会返回 tuple(self._data.values()) 以获取值的快照。

标签: python dictionary collections iteration iterable


【解决方案1】:

这始于设计决策。当你迭代MyCollection你想要什么数据?如果它是包含字典的值,则可以返回其迭代器,然后根本不实现 __next__

class MyCollection:
    def __init__(self):
        self._data = {}

    def __iter__(self):
            '''
        Return an iterator of contained values
        '''
        return iter(self._data.values())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多