J'essaie de construire un arbre général.
Existe-t-il des structures de données intégrées en Python pour l'implémenter?
python
data-structures
tree
vishnu
la source
la source
Réponses:
anytree
Je recommande https://pypi.python.org/pypi/anytree (je suis l'auteur)
Exemple
Caractéristiques
anytree dispose également d'une puissante API avec:
la source
anytree
s'agisse probablement d'une excellente bibliothèque, il s'agit d'une question python, pas d'une question Node.js.Python n'a pas la gamme assez étendue de structures de données "intégrées" comme Java. Cependant, comme Python est dynamique, une arborescence générale est facile à créer. Par exemple, un arbre binaire peut être:
Vous pouvez l'utiliser comme ceci:
la source
class Tree
de l'objetobject
n'est parfois qu'une indication: si une classe hérite d'aucune autre classe de base, hérite explicitement de l'objet. Cela s'applique également aux classes imbriquées. Voir Google Python Style GuideUn arbre générique est un nœud avec zéro ou plusieurs enfants, chacun un nœud (arbre) approprié. Ce n'est pas la même chose qu'un arbre binaire, ce sont des structures de données différentes, bien que les deux partagent une certaine terminologie.
Il n'y a pas de structure de données intégrée pour les arbres génériques en Python, mais elle est facilement implémentée avec des classes.
la source
Tu peux essayer:
Comme suggéré ici: https://gist.github.com/2012250
la source
la source
Il n'y a pas d'arbres intégrés, mais vous pouvez facilement en créer un en sous-classant un type de nœud dans List et en écrivant les méthodes de traversée. Si tu fais ça, j'ai trouvé la bissecte utile.
Il existe également de nombreuses implémentations sur PyPi que vous pouvez parcourir.
Si je me souviens bien, la bibliothèque standard Python n'inclut pas de structures de données arborescentes pour la même raison que la bibliothèque de classes de base .NET ne le fait pas: la localité de la mémoire est réduite, ce qui entraîne plus de ratés de cache. Sur les processeurs modernes, il est généralement plus rapide d'apporter simplement une grande partie de la mémoire dans le cache, et les structures de données "riches en pointeurs" annulent l'avantage.
la source
J'ai implémenté un arbre enraciné comme un dictionnaire
{child:parent}
. Ainsi, par exemple avec le nœud racine0
, un arbre pourrait ressembler à ceci:Cette structure permettait assez facilement de remonter le long d'un chemin depuis n'importe quel nœud jusqu'à la racine, ce qui était pertinent pour le problème sur lequel je travaillais.
la source
{parent:[leftchild,rightchild]}
.La réponse de Greg Hewgill est excellente mais si vous avez besoin de plus de nœuds par niveau, vous pouvez utiliser une liste | dictionnaire pour les créer: Et puis utilisez la méthode pour y accéder par nom ou par ordre (comme id)
Il suffit maintenant de créer une racine et de la construire: ex:
Cela devrait vous suffire pour commencer à comprendre comment faire fonctionner cela
la source
fonctionne comme un dictionnaire, mais fournit autant de textes imbriqués que vous le souhaitez. Essayez ce qui suit:
fournira un dict imbriqué ... qui fonctionne comme un arbre en effet.
... Si vous avez déjà un dict, il lancera chaque niveau dans un arbre:
De cette façon, vous pouvez continuer à éditer / ajouter / supprimer chaque niveau de dict comme vous le souhaitez. Toutes les méthodes dict pour la traversée, etc., s'appliquent toujours.
la source
dict
au lieu dedefaultdict
? D'après mes tests, étendredefaultdict
au lieu de dict puis ajouterself.default_factory = type(self)
en haut d'init devrait fonctionner de la même manière.J'ai implémenté des arbres à l'aide de dict imbriqués. C'est assez facile à faire et cela a fonctionné pour moi avec des ensembles de données assez volumineux. J'ai posté un exemple ci-dessous, et vous pouvez en voir plus sur le code Google
la source
J'ai publié une implémentation d'arborescence Python [3] sur mon site: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
J'espère que c'est utile,
Ok, voici le code:
la source
Si quelqu'un a besoin d'un moyen plus simple de le faire, un arbre n'est qu'une liste imbriquée récursivement (puisque l'ensemble n'est pas hachable):
Où chaque branche est une paire:
[ object, [children] ]
et chaque feuille est une paire:
[ object, [] ]
Mais si vous avez besoin d'une classe avec des méthodes, vous pouvez utiliser n'importe quel arbre.
la source
De quelles opérations avez-vous besoin? Il existe souvent une bonne solution en Python en utilisant un dict ou une liste avec le module bissect.
Il existe de nombreuses implémentations d'arborescence sur PyPI , et de nombreux types d'arborescence sont presque triviaux à implémenter vous-même en Python pur. Cependant, cela est rarement nécessaire.
la source
Une autre implémentation d'arbre basée sur la réponse de Bruno :
Et un exemple d'utilisation:
Qui devrait produire:
la source
Je suggère la bibliothèque networkx .
Un exemple de construction d'un arbre:
Je ne sais pas ce que vous entendez par " arbre général ",
mais la bibliothèque permet à chaque nœud d'être n'importe quel objet lavable , et il n'y a pas de contrainte sur le nombre d'enfants de chaque nœud.
La bibliothèque fournit également des algorithmes graphiques liés aux arborescences et aux capacités de visualisation .
la source
Si vous souhaitez créer une structure de données arborescente, vous devez d'abord créer l'objet treeElement. Si vous créez l'objet treeElement, vous pouvez alors décider du comportement de votre arbre.
Pour ce faire, voici la classe TreeElement:
Maintenant, nous devons utiliser cet élément pour créer l'arbre, j'utilise un arbre A * dans cet exemple.
Vous pouvez ajouter / supprimer des éléments de l'objet, mais rendre la structure intacte.
la source
la source