Как размножить узлы дерева в Python

1

Я имею дело с древовидной структурой в программе Python. Каждый узел в дереве имеет словарные "сыновья", ключи которых содержат информацию о дуге, а значения - это узлы сына. Вопрос заключается в распространении списка узлов на всех своих сыновей. Я использую:

current_nodes = reduce(lambda s,x:s+x, map(lambda node:node.sons.values(),current_nodes),[])

Где current_nodes - это начальный (и обновленный) список узлов.

Моя программа тратит больше времени на выполнение этой операции уменьшения. Есть ли более быстрый способ реализовать это?

Спасибо!

EDIT: Привет. Просто сообщите, что код: sum((node.sons.values() for node in current_nodes), []) хотя и pythonic, на самом деле не намного быстрее - если список узлов длинный (> 20000), распространение замедляется непропорционально, фактически, очень медленно. Я не знаю почему.

Затем я определяю:

def Ext(nodes)
    l=[]
    for node in nodes:
        l.extend(node.sons.values())
    return l

Затем я использую: current_node = Ext(current_node). Этот подход на самом деле намного быстрее. Я думаю, что функция sum() не так эффективна, как метод расширения списка при обработке конкатенации списков.

  • 0
    почему вы используете это уродливое reduce когда sum делает работу? То же самое с этой уродливой map : List comprehensions FTW
  • 0
    Может ли сумма объединить список списков?
Показать ещё 3 комментария
Теги:
reduce
tree

1 ответ

4
Лучший ответ
from itertools import chain
list(chain.from_iterable(node.sons.values() for node in current_nodes))

Быть быстрее. map и reduce на lambda медленны. Я не знаю, как быстро chain; вы можете попробовать

sum((node.sons.values() for node in current_nodes), [])

также.

  • 0
    Я думал, что вы отдыхаете;)
  • 0
    Я вхожу один раз в день, чтобы поработать над весом своего флага, и я случайно увидел это :)
Показать ещё 1 комментарий
Сообщество Overcoder
Наверх
Меню