Python 如何实施";“下一步”;dictionary对象是否可编辑?
我有一个字典的包装器:Python 如何实施";“下一步”;dictionary对象是否可编辑?,python,python-2.7,dictionary,iterator,iterable,Python,Python 2.7,Dictionary,Iterator,Iterable,我有一个字典的包装器: 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):
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
_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
我的问题是,我不知道如何实现
next
方法以使MyDict
可编辑。如有任何建议,将不胜感激 字典本身不是迭代器(只能迭代一次)。您通常将它们设置为iterable,可以为其生成多个迭代器
完全删除next
方法,让\uuuu iter\uuuu
在每次调用时返回一个iterable对象。这可以非常简单,只需为self.container
返回迭代器即可:
def __iter__(self):
return iter(self.container)
如果必须使类成为迭代器,则必须以某种方式跟踪当前迭代位置,并在到达“结束”时提出StopIteration
。一个简单的实现可能是将iter(self.container)
对象存储在self
上,第一次调用\uuuu iter\uuuu
:
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
。如果底层字典被修改(添加或删除了键)并且迭代顺序被破坏,它也会引发异常
另一种方法是每次只存储在整数位置并索引到列表(self.container)
,而忽略插入或删除会改变字典的迭代顺序这一事实:
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
_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
在这两种情况下,对象都是只能迭代一次的迭代器。一旦到达末尾,就不能重新启动它。字典本身不是迭代器(只能迭代一次)。您通常将它们设置为iterable,可以为其生成多个迭代器 完全删除
next
方法,让\uuuu iter\uuuu
在每次调用时返回一个iterable对象。这可以非常简单,只需为self.container
返回迭代器即可:
def __iter__(self):
return iter(self.container)
如果必须使类成为迭代器,则必须以某种方式跟踪当前迭代位置,并在到达“结束”时提出StopIteration
。一个简单的实现可能是将iter(self.container)
对象存储在self
上,第一次调用\uuuu iter\uuuu
:
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
。如果底层字典被修改(添加或删除了键)并且迭代顺序被破坏,它也会引发异常
另一种方法是每次只存储在整数位置并索引到列表(self.container)
,而忽略插入或删除会改变字典的迭代顺序这一事实:
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
_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
在这两种情况下,对象都是只能迭代一次的迭代器。一旦到达末尾,就不能再重新启动它。例如,如果您希望能够在嵌套循环中使用类似dict的对象,或者任何其他需要对同一对象进行多次迭代的应用程序,那么您需要实现一个返回新创建的迭代器对象的方法 Python的iterable对象都可以做到这一点:
>>> [1, 2, 3].__iter__()
<listiterator object at 0x7f67146e53d0>
>>> iter([1, 2, 3]) # A simpler equivalent
<listiterator object at 0x7f67146e5390>
有关可能需要的更多详细信息,请参见。如果您希望能够在嵌套循环中使用类似dict的对象,例如,或任何其他需要对同一对象进行多次迭代的应用程序,则需要实现一个返回新创建的迭代器对象的
\uiter\uuuuuu
方法
Python的iterable对象都可以做到这一点:
>>> [1, 2, 3].__iter__()
<listiterator object at 0x7f67146e53d0>
>>> iter([1, 2, 3]) # A simpler equivalent
<listiterator object at 0x7f67146e5390>
有关可能需要的更多详细信息,请参阅