【发布时间】:2017-05-30 00:45:48
【问题描述】:
我正在尝试修改以下代码,以便 MyCollection 将包装一个字典。我仍然需要实现 iter 和 next 方法才能拥有“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