我需要通过检查节点中的分支总和是否大于零来搜索树。但是,我遇到了总和的问题 - 我在
上得到了一个类型错误(int对象不可调用)branch_sum = [t[0] for t in current]
线。我以为是因为最终我会得到一个节点
current = [[1,'b']]
(例如),所以我添加了if / else语句。即我以为我试图总结一下这样的东西:
first = [1]
然而,问题仍然存在。我不确定导致这种情况的原因。
作为参考,current是列表列表,第一个插槽是节点数据,第二个插槽是节点id(在内部列表中)。 group()函数根据子节点的id对节点上的数据进行分组(左子节点的id以1开头,右边的id以0开头)。
我正在搜索的树存储为列表,如:
tree = [[0, '1'], [1,'01'], [0,'001']]
即。这是一套霍夫曼代码。
from collections import deque
def group(items):
right = [[item[0],item[1][1:]] for item in items if item[1].startswith('1')]
left = [[item[0],item[1][1:]] for item in items if item[1].startswith('0')]
return left, right
def search(node):
loops = 0
to_crawl = deque(group(node))
while to_crawl:
current = to_crawl.popleft() # this is the left branch of the tree
branch_sum = 0
if len(current)==1:
branch_sum = sum([t for t in current])
else:
branch_sum = sum([t[0] for t in current])
if branch_sum !=0 :
l,r = group(current)
to_crawl.extendleft(r)
to_crawl.extendleft(l)
loops += 1
return loops
这是我正在尝试做的事情:
一棵树,有很多数据为0,找到1.要做到这一点,将树分成两个分支(通过group()函数)并按下deque。从双端队列中弹出一个分支,然后对分支中的数据求和。如果总和不为零,则将分支拆分为两个子分支,将子分支推入双端子。继续这样做,直到我找到非零数据。当我退出时,我应该在双端队列中以[1,'101']的形式结束。
答案 0 :(得分:3)
我强烈认为错误是
TypeError: 'int' object is not iterable
因为你最终将{2}元组作为node
传递给
to_crawl = deque(group(node))
给你一个2元素的双端队列。然后
current = to_crawl.popleft()
为current
提供单个元素(整数)。这显然是不可迭代的,这会导致给定的错误。
旁注:为简洁起见,您可以使用这样的总和
sum(current)
而不是
sum([x for x in current])