Estou tentando construir uma árvore geral.
Existe alguma estrutura de dados interna no Python para implementá-lo?
python
data-structures
tree
vishnu
fonte
fonte
Respostas:
anytree
Eu recomendo https://pypi.python.org/pypi/anytree (eu sou o autor)
Exemplo
Recursos
anytree também possui uma API poderosa com:
fonte
anytree
seja provavelmente uma ótima biblioteca, esta é uma questão de python, não uma questão do Node.js.O Python não possui a ampla variedade de estruturas de dados "internas", como o Java. No entanto, como o Python é dinâmico, é fácil criar uma árvore geral. Por exemplo, uma árvore binária pode ser:
Você pode usá-lo assim:
fonte
class Tree
de objeto, em seguida,object
às vezes é apenas uma diretriz: se uma classe não herda de nenhuma outra classe base, herda explicitamente do objeto. Isso também se aplica a classes aninhadas. Veja o Guia de estilos do Google PythonUma árvore genérica é um nó com zero ou mais filhos, cada um um nó (árvore) apropriado. Não é o mesmo que uma árvore binária, são estruturas de dados diferentes, embora ambas compartilhem alguma terminologia.
Não existe nenhuma estrutura de dados integrada para árvores genéricas no Python, mas é facilmente implementada com classes.
fonte
Podes tentar:
Conforme sugerido aqui: https://gist.github.com/2012250
fonte
fonte
Não há árvores embutidas, mas você pode facilmente construir uma subclassificando um tipo de Nó da Lista e escrevendo os métodos de deslocamento. Se você fizer isso, achei a bissetriz útil.
Também há muitas implementações no PyPi que você pode navegar.
Se bem me lembro, a lib padrão do Python não inclui estruturas de dados em árvore pelo mesmo motivo que a biblioteca de classes base .NET não: a localidade da memória é reduzida, resultando em mais falhas de cache. Nos processadores modernos, geralmente é mais rápido inserir apenas uma grande parte da memória no cache, e as estruturas de dados "ricas em ponteiros" negam o benefício.
fonte
Eu implementei uma árvore enraizada como um dicionário
{child:parent}
. Por exemplo, com o nó raiz0
, uma árvore pode se parecer com isso:Essa estrutura facilitou a subida ao longo de um caminho de qualquer nó até a raiz, o que era relevante para o problema em que eu estava trabalhando.
fonte
{parent:[leftchild,rightchild]}
.A resposta de Greg Hewgill é ótima, mas se você precisar de mais nós por nível, poderá usar um dicionário de lista | para criá-los: E use o método para acessá-los por nome ou ordem (como id)
Agora, basta criar uma raiz e construí-la: ex:
Isso deve ser o suficiente para você começar a descobrir como fazer isso funcionar
fonte
funciona como um dicionário, mas fornece quantos dicionários aninhados você deseja. Tente o seguinte:
entregará um ditado aninhado ... que funciona como uma árvore.
... Se você já possui um ditado, ele converterá cada nível em uma árvore:
Dessa forma, você pode manter a edição / adição / remoção de cada nível de ditado, conforme desejar. Todos os métodos de ditado para travessia etc, ainda se aplicam.
fonte
dict
vez dedefaultdict
? Nos meus testes, estender emdefaultdict
vez de dict e depois adicionarself.default_factory = type(self)
ao topo do init deve funcionar da mesma maneira.Implementei árvores usando dict aninhados. É muito fácil de fazer e funcionou para mim com conjuntos de dados bastante grandes. Publiquei uma amostra abaixo e você pode ver mais no código do Google
fonte
Publiquei uma implementação em árvore do Python [3] no meu site: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
Espero que seja útil,
Ok, aqui está o código:
fonte
Se alguém precisar de uma maneira mais simples de fazer isso, uma árvore será apenas uma lista aninhada recursivamente (já que o conjunto não é lavável):
Onde cada ramo é um par:
[ object, [children] ]
e cada folha é um par:
[ object, [] ]
Mas se você precisar de uma classe com métodos, poderá usar anytree.
fonte
Quais operações você precisa? Geralmente, existe uma boa solução no Python usando um dict ou uma lista com o módulo bisect.
Existem muitas implementações de árvores no PyPI e muitos tipos de árvores são quase triviais para se implementar no Python puro. No entanto, isso raramente é necessário.
fonte
Outra implementação de árvore baseada vagamente na resposta de Bruno :
E um exemplo de como usá-lo:
Qual deve ser a saída:
fonte
Eu sugiro a biblioteca networkx .
Um exemplo de construção de uma árvore:
Não sei ao certo o que você quer dizer com " Árvore Geral ",
mas a biblioteca permite que cada nó seja um objeto hashável , e não há restrição no número de filhos de cada nó.
A biblioteca também fornece algoritmos gráficos relacionados a árvores e recursos de visualização .
fonte
Se você deseja criar uma estrutura de dados em árvore, primeiro é necessário criar o objeto treeElement. Se você criar o objeto treeElement, poderá decidir como sua árvore se comporta.
Para fazer isso a seguir é a classe TreeElement:
Agora, precisamos usar esse elemento para criar a árvore. Estou usando a árvore A * neste exemplo.
Você pode adicionar / remover qualquer elemento do objeto, mas tornar a estrutura intacta.
fonte
fonte