gpt4 book ai didi

Python for 循环不适用于自定义容器

转载 作者:行者123 更新时间:2023-11-28 23:06:52 24 4
gpt4 key购买 nike

编辑:我将 __iter__ 添加到我的 Map 类(我忘了它不是从 Tree 继承的),但现在 for 循环返回“生成器对象”:

<generator object _next at 0x82a4b94>
Traceback (most recent call last):
File "Map.py", line 43, in <module>
print "First: %s, Second: %s" % (pair.first(), pair.second())
AttributeError: 'generator' object has no attribute 'first'

所以我的下一个函数有问题,对吗?


为了好玩,我用 Python 创建了一个 RedBlack 树,它工作正常。现在为了从 C++ 复制 STL,我创建了一个 Map 类来包装树,作为 Python dict 的替代品。

问题是当我尝试循环遍历 map 时,它无法正常工作。

phonebook = Map()
phonebook["Joe"] = "555-555-3422"
phonebook["Rob"] = "231-523-2357"

for pair in phonebook:
print "First: %s, Second: %s" % (pair.first(), pair.second())

我得到的错误是:

Traceback (most recent call last):
File "Map.py", line 38, in <module>
for pair in phonebook:
File "Map.py", line 19, in __getitem__
return self._tree.find(key)
File "Python/Tree/SearchTree.py", line 82, in find
raise TreeException('No node with key %s' % key)
Tree.TreeException: 'No node with key 0'

我不知道为什么它要查找键 0,而我的键是字符串。使用 pdb 我注意到在 for 循环开始后,执行的第一行是调用 __getitem__ 键为 0....

map 定义为:

class Map:
def __init__(self):
self._tree = RedBlackTree()

def __getitem__(self, key):
return self._tree.find(key)

def __setitem__(self, key, item):
self._tree.insert(Pair(key, item))

根据我的理解,我必须为我的树创建一个迭代器,这样它才能正常工作。我不太确定该怎么做,所以我环顾四周并结合了几种方法:(在我的 RedBlack 树实现中,NULL 是一个实际节点)

class TreeIterator():
def __init__(self, root, size):
self._current = root
self._size = size
self.num_visited = 0

def __iter__(self):
return self

def next(self):
return self._next(self._current)

def _next(self, curr):
self.num_visited = self.num_visited + 1
if self.num_visited == self._size:
raise StopIteration

if curr.left is not None and curr.left is not TreeNode.NULL:
for node in _next(curr.left):
yield node

yield curr
if curr.right is not None and curr.right is not TreeNode.NULL:
for node in _next(curr.right):
yield node

在我的 SearchTree 父类(super class)中:

def __iter__(self):
return TreeIterator(self.root, self.size)

我做错了什么?

最佳答案

您的 Map 类没有 __iter__ 方法,所以 for 调用 __getitem__ 代替。您应该从 SearchTree 继承 Map 或在 Map 中实现 __iter__

关于Python for 循环不适用于自定义容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4451922/

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