gpt4 book ai didi

python - 如何为可迭代的字典对象实现 "next"?

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:02 24 4
gpt4 key购买 nike

我有以下字典包装器:

class MyDict:
def __init__(self):
self.container = {}

def __setitem__(self, key, value):
self.container[key] = value

def __getitem__(self, key):
return self.container[key]

def __iter__(self):
return self

def next(self):
pass

dic = MyDict()
dic['a'] = 1
dic['b'] = 2

for key in dic:
print key

我的问题是我不知道如何实现 next 方法来使 MyDict 可迭代。任何意见,将不胜感激。

最佳答案

字典本身不是迭代器(只能迭代一次)。您通常将它们设为可迭代,您可以为其生成多个迭代器

完全删除 next 方法,让 __iter__ 在每次调用时返回一个可迭代对象。这可以像为 self.container 返回一个迭代器一样简单:

def __iter__(self):
return iter(self.container)

如果您必须让您的类成为迭代器,您将不得不以某种方式跟踪当前迭代位置并在到达“结束”时引发StopIteration。一个简单的实现可能是在第一次调用 __iter__ 时将 iter(self.container) 对象存储在 self 上:

def __iter__(self):
return self

def next(self):
if not hasattr(self, '_iter'):
self._iter = iter(self.container)
return next(self._iter)

此时 iter(self.container) 对象负责为您跟踪迭代位置,并在到达终点时引发 StopIteration。如果基础字典被更改(添加或删除了键)并且迭代顺序被破坏,它也会引发异常。

另一种方法是每次都存储在整数位置并索引到 list(self.container) 中,而忽略插入或删除会改变迭代顺序的事实字典:

_iter_index = 0

def __iter__(self):
return self

def next(self):
idx = self._iter_index
if idx is None or idx >= len(self.container):
# once we reach the end, all iteration is done, end of.
self._iter_index = None
raise StopIteration()
value = list(self.container)[idx]
self._iter_index = idx + 1
return value

在这两种情况下,您的对象都是一个迭代器,只能迭代一次。一旦到达终点,就无法重新启动。

关于python - 如何为可迭代的字典对象实现 "next"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com