Я пытаюсь построить общее дерево.
Есть ли в Python встроенные структуры данных для его реализации?
python
data-structures
tree
Вишну
источник
источник
Ответы:
anytree
Я рекомендую https://pypi.python.org/pypi/anytree (я автор)
пример
Характеристики
У anytree также есть мощный API с:
источник
anytree
это, вероятно, отличная библиотека, это вопрос Python, а не вопрос Node.js.Python не обладает таким обширным диапазоном «встроенных» структур данных, как в Java. Однако, поскольку Python является динамическим, общее дерево легко создать. Например, двоичное дерево может быть:
Вы можете использовать это так:
источник
class Tree
из объектаobject
иногда является лишь руководством: если класс наследует от других базовых классов, явно наследовать от объекта. Это также относится к вложенным классам. См. Руководство по стилю Google PythonРодовое дерево - это узел с нулем или более дочерних узлов, каждый из которых является собственным (древовидным) узлом. Это не то же самое, что бинарное дерево, это разные структуры данных, хотя обе имеют общую терминологию.
В Python нет встроенной структуры данных для универсальных деревьев, но ее легко реализовать с помощью классов.
источник
Можешь попробовать:
Как предлагается здесь: https://gist.github.com/2012250
источник
источник
Деревья не встроены, но вы можете легко сконструировать их, создав подкласс типа Node из List и написав методы обхода. Если вы сделаете это, я нашел пополам полезным.
Есть также много реализаций на PyPi которые вы можете просмотреть.
Если я правильно помню, стандартная библиотека Python не включает древовидные структуры данных по той же причине, что и библиотека базовых классов .NET: локальность памяти уменьшается, что приводит к большему количеству пропусков кэша. На современных процессорах обычно быстрее просто помещать большой объем памяти в кеш, а структуры данных с «указателем» сводят на нет преимущества.
источник
Я реализовал корневое дерево как словарь
{child:parent}
. Так, например, с корневым узлом0
дерево может выглядеть так:Эта структура позволила довольно легко идти вверх по пути от любого узла к корню, что было актуально для проблемы, над которой я работал.
источник
{parent:[leftchild,rightchild]}
.Ответ Грега Хьюгилла великолепен, но если вам нужно больше узлов на уровень, вы можете использовать список | словарь для их создания: а затем использовать метод для доступа к ним по имени или по порядку (например, id)
Теперь просто создайте рут и создайте его: ex:
Этого должно быть достаточно, чтобы вы начали выяснять, как сделать эту работу
источник
работает как словарь, но предоставляет столько вложенных диктов, сколько вы хотите. Попробуйте следующее:
доставит вложенный диктат ... который действительно работает как дерево.
... Если у вас уже есть диктат, он будет преобразовывать каждый уровень в дерево:
Таким образом, вы можете редактировать / добавлять / удалять каждый уровень диктовок по своему усмотрению. Все методы dict для обхода и т. Д. Все еще применяются.
источник
dict
вместоdefaultdict
? Судя по моим тестам, расширениеdefaultdict
вместо dict, а затем добавлениеself.default_factory = type(self)
в начало init должно работать точно так же.Я реализовал деревья с помощью вложенных диктов. Это довольно легко сделать, и это сработало для меня с довольно большими наборами данных. Я разместил образец ниже, и вы можете увидеть больше в коде Google
источник
Я опубликовал реализацию дерева Python [3] на своем сайте: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
Надеюсь, что это полезно,
Хорошо, вот код:
источник
Если кому-то нужен более простой способ сделать это, дерево является только рекурсивно-вложенным списком (так как множество не является хешируемым):
Где каждая ветвь представляет собой пару,
[ object, [children] ]
а каждый лист представляет собой пару:
[ object, [] ]
Но если вам нужен класс с методами, вы можете использовать anytree.
источник
Какие операции вам нужны? В Python часто есть хорошее решение, использующее dict или список с модулем bisect.
Существует множество реализаций дерева в PyPI , и многие типы деревьев почти тривиальны, чтобы реализовать себя в чистом Python. Однако это редко необходимо.
источник
Другая реализация дерева, основанная на ответе Бруно :
И пример того, как его использовать:
Который должен вывести:
источник
Я предлагаю библиотеку networkx .
Пример построения дерева:
Я не уверен, что вы подразумеваете под « общим деревом»,
но библиотека позволяет каждому узлу быть любым хешируемым объектом , и нет никаких ограничений на количество дочерних элементов, которое имеет каждый узел.
Библиотека также предоставляет графические алгоритмы, связанные с деревьями и возможностями визуализации .
источник
Если вы хотите создать древовидную структуру данных, то сначала вы должны создать объект treeElement. Если вы создаете объект treeElement, вы можете решить, как будет вести себя ваше дерево.
Для этого используется класс TreeElement:
Теперь мы должны использовать этот элемент для создания дерева, в этом примере я использую дерево A *.
Вы можете добавлять / удалять любые элементы из объекта, но сделать структуру взаимной.
источник
источник