Мне нужно искать в дереве, проверяя, больше ли сумма ветвей от узла нуля. Однако у меня проблема с суммой - я получаю ошибку типа (объект int не вызывается) на
branch_sum = [t[0] for t in current]
Линия. Я думал, это потому, что в конце концов я получу единственный узел
current = [[1,'b']]
(например), поэтому я добавил оператор if / else. Т.е. Я думал, что пытаюсь подвести итог примерно так:
first = [1]
Однако проблема все еще сохраняется. Я не уверен, что могло быть причиной этого.
Для справки, current - это список списков, где первый слот - это данные узла, второй слот - это идентификатор узла (во внутреннем списке). Функция group () группирует данные на узле на основе идентификаторов подузлов (левые подузлы имеют идентификаторы, начинающиеся с 1, правые - идентификаторы, начинающиеся с 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
Вот что я пытаюсь сделать:
GI Даже в дереве с большим количеством данных, равным 0, найдите 1. Для этого разделите дерево на две ветви (с помощью функции group ()) и нажмите на deque. Удалите ветку из двухсторонней очереди, затем просуммируйте данные в ветке. Если сумма не равна нулю, разделите ветвь на две подчиненные ветви, поместите подчиненные ветви в двухстороннюю очередь. Продолжайте делать это, пока не найду ненулевое значение. Когда я выхожу, у меня должен получиться единственный элемент формы [1, '101'] в двухсторонней очереди.
1 ответ
Я твердо предполагаю, что ошибка говорит
TypeError: 'int' object is not iterable
Потому что вы в конечном итоге передаете кортеж из 2 как node
в
to_crawl = deque(group(node))
Что дает вам двухэлементную двухэлементную очередь. потом
current = to_crawl.popleft()
Дает вам единственный элемент (целое число) как current
. Это явно не повторяется, что приводит к данной ошибке.
Боковое примечание: для краткости вы можете использовать такую сумму
sum(current)
Вместо того
sum([x for x in current])
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
group
? поскольку это кажется важным для структуры переменнойto_crawl
.