Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实施";“下一步”;dictionary对象是否可编辑?_Python_Python 2.7_Dictionary_Iterator_Iterable - Fatal编程技术网

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>
有关可能需要的更多详细信息,请参阅