Мне нужно искать в дереве, проверяя, больше ли сумма ветвей от узла нуля. Однако у меня проблема с суммой - я получаю ошибку типа (объект 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
Tom Kealy 16 Окт 2013 в 14:18
Вы можете показать нам свою функцию group? поскольку это кажется важным для структуры переменной to_crawl.
 – 
jorispilot
16 Окт 2013 в 14:32
Добавлено, но я думаю, что проблема более локализована, чем это.
 – 
Tom Kealy
16 Окт 2013 в 14:36
Не могли бы вы дать нам код самого дерева? Я имею в виду, что нам немного сложно отладить проблему, если у нас нет класса и варианта использования. Кроме того, есть ли обратная связь?
 – 
Games Brainiac
16 Окт 2013 в 15:21
Вы уверены, что в сообщении об ошибке написано «int object is not callable», а не «int object is not ITERABLE»?
 – 
Johannes Charra
16 Окт 2013 в 15:26
Да, извини, я торопился на встречу.
 – 
Tom Kealy
16 Окт 2013 в 17:25

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])
3
Johannes Charra 16 Окт 2013 в 15:35
Почему бы len (current) не выдать ошибку 'int has no len ()', если я popleft () int?
 – 
Tom Kealy
16 Окт 2013 в 17:34
Я хочу продолжать выталкивать и подталкивать ветви дерева в двухстороннюю очередь до тех пор, пока в двухсторонней очереди не останется только один [0, '101'], а затем выйти из цикла. Как здесь написано, он будет продолжать появляться, когда дойдет до этого ящика.
 – 
Tom Kealy
16 Окт 2013 в 17:53