OVH Cloud OVH Cloud

arbres, listes chainées ...

19 réponses
Avatar
Gael
Bonjour,

j'espère que ma question n'est pas trop triviale: "je débute".

Je cherche un exemple d'algorithme pour manipuler un arbre (je ne sais
pas quel type de données utiliser).

Mon objectif est de recueillir des données externes, les manipuler
(opérations sur chaines de caractères, tri, ...) pour ensuite écrire un
fichier XML.

J'avais fait ce genre de choses jadis en C, mais sans pointeur, je ne
sais pas comment le réaliser.

Merci d'avance.

10 réponses

1 2
Avatar
Hervé Cauwelier
J'avais fait ce genre de choses jadis en C, mais sans pointeur, je ne
sais pas comment le réaliser.


Tant mieux qu'il n'y en ait pas. :-)

Si tu as un besoin, regarde ce que t'offre la bibliothèque standard. Pas
de secret, les modules qui ont besoin des pointeurs ou ont des
contraintes de performances sont faits en C.

Tu peux toujours feinter avec des dictionnaires et des listes, mais
l'algorithme risque d'être gros, difficile et les performances déplorables.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
Jerome
Gael wrote:
Bonjour,



Bonjour

j'espère que ma question n'est pas trop triviale: "je débute".


Il faut bien commencer un jour


Je cherche un exemple d'algorithme pour manipuler un arbre (je ne sais
pas quel type de données utiliser).


en python tu as le choix
- structure récursive
- structure itérative avec un tableau
- arbre dom
- ...

je peux te filer des exmples pour tout ce que je cite si tu veux



Mon objectif est de recueillir des données externes, les manipuler
(opérations sur chaines de caractères, tri, ...) pour ensuite écrire un
fichier XML.


Autant avoir une structure dom alors. Tu seras déjà dans le monde xml.


J'avais fait ce genre de choses jadis en C, mais sans pointeur, je ne
sais pas comment le réaliser.


Tu as des pointeurs en python... Ca marche pareil.

Considère par exemple le code minimal suivant

class BinTree:

def __init__(self):
self.l_son = None
self.r_son = None
self.cnt = None

def __repr__(self):
s = str(self.cnt) + ' '
if self.l_son:
s += str(self.l_son)
if self.r_son:
s += str(self.r_son)
return s

a = BinTree()
b = BinTree()
c = BinTree()

a.l_son = b
a.r_son = c
a.cnt = 'root'
b.cnt = 'fils_gauche'
c.cnt = 'fils_droit'

print a



Merci d'avance.


Avatar
Do Re Mi chel La Si Do
Bonsoir !


Pour le cas particulier des arbres XMLisables, regarde ElementTree
(http://effbot.org/zone/element-index.htm)

Pour les listes chaînées, je pense que les listes de Python suffisent
largement.


@-salutations

Michel Claveau
Avatar
Gael
Je cherche un exemple d'algorithme pour manipuler un arbre (je ne sais
pas quel type de données utiliser).



en python tu as le choix
- structure récursive
- structure itérative avec un tableau
- arbre dom
- ...

je peux te filer des exmples pour tout ce que je cite si tu veux

Oui, je suis preneur !


Tu as des pointeurs en python... Ca marche pareil.


Ha bon ... autant pour moi, je ne savais pas.

Considère par exemple le code minimal suivant

class BinTree:

def __init__(self):
self.l_son = None
self.r_son = None
self.cnt = None

def __repr__(self):
s = str(self.cnt) + ' '
if self.l_son:
s += str(self.l_son)
if self.r_son:
s += str(self.r_son)
return s

a = BinTree()
b = BinTree()
c = BinTree()

a.l_son = b
a.r_son = c
a.cnt = 'root'
b.cnt = 'fils_gauche'
c.cnt = 'fils_droit'

print a


Je vais y réfléchir ... c'est une piste, mais le nombre fini de fils
m'embête...


Avatar
Gael
Bonsoir !

Pour les listes chaînées, je pense que les listes de Python suffisent
largement.


Ce que je veux manipuler c'est quelquechose comme ça (une structure
hiérarchique) : je ne crois pas pouvoir le faire avec des listes.

direction
|
---secretariat
|
sec_dir
|
---r&d
|
---recherche
|
veille

---dev
|
python
|
---zope
---integration
---scient
|
perl
|
logistique

En fait, je lis les infos suivantes :

logistique
direction/secretariat/sec_dir
direction/r&d
direction/recherche/veille
direction/dev/python/zope
direction/dev/python/integration
direction/dev/python/scient
direction/dev/perl

et je veux écrire le fixhier XML correspondant.



@-salutations

Michel Claveau






Avatar
Salvatore
Bonsoir,

Voici un petit script que j'ai écrit il y a un petit moment

Peut-^tre peux-tu t'en inspirer ?

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/325734

Cordialement

Salvatore
Avatar
Bruno Desthuilliers

Je cherche un exemple d'algorithme pour manipuler un arbre (je ne
sais pas quel type de données utiliser).




en python tu as le choix
- structure récursive
- structure itérative avec un tableau
- arbre dom
- ...

je peux te filer des exmples pour tout ce que je cite si tu veux

Oui, je suis preneur !


Tu as des pointeurs en python... Ca marche pareil.


Ha bon ... autant pour moi, je ne savais pas.


D'autant que ça ne marche pas exactement pareil en fait. En Python, il
n'y a pas de pointeurs, il y a des références. Une "variable" Python est
un nom associé à une référence à un objet. Un même objet peut être
référencé par plusieurs noms. Si tu modifie l'association nom/objet
(réassignation), ça n'aura d'incidence que sur ce nom (ie: dans l'espace
de nommage dans lequel est défini le nom). Par contre, si tu modifie
l'objet référencé par le nom, c'est bien l'objet lui-même que tu
modifie. Ex:

a = [1, 2]
b = a
b.append(3)
print a
-> [1, 2, 3]

def modifie(uneListe):
""" La modification modifie l'objet initialement
référencé par le nom uneListe
"""
print "dans modifie - avant, uneListe = %s" % uneListe"
uneListe.insert(0, "modifie")
print "dans modifie - apres, uneListe = %s" % uneListe"

def reassigne(uneListe):
""" La réassignation ne modifie pas l'objet initialement
référencé par le nom uneListe, car ce nom est local
à la fonction.
"""
print "dans reassigne - avant, uneListe = %s" % uneListe"
uneListe = ['titi', 'toto', 'tata']
print "dans reassigne - apres, uneListe = %s" % uneListe"


modifie(a)
print "apres modifie(a), a = %" % a

reassigne(a)
print "apres reassigne(a), a = %" % a

print "et maintenant, b est devenu : "
print b

Dans la pratique, on est bien dans une logique proche des pointeurs C,
gestion manuelle de la mémoire et des types en moins.

Attention quand même: certains objets sont immutables (on ne peut pas
les modifier une fois créés), par exemple les nombres, les chaines et
les tuples. Ce qui veut dire qu'une fonction ne peut pas avoir d'effet
de bords sur un objet d'un de ces types.

(snip code)

Je vais y réfléchir ... c'est une piste, mais le nombre fini de fils
m'embête...
Dans un arbre binaire, c'est assez logique de n'avoir que deux fils...

Mais bon:

class Tree(object):
def __init__(self, cnt='', childrens=None):
self.cnt = cnt
if childrens is None: childrens = []
self.childrens = childrens

def __str__(self):
s = ["+%s " % str(self.cnt)]
for c in self.childrens:
s.append("- %s" % str(c))
return "n".join(s)

# dummy
def add_child(self, child):
self.childrens.append(child)

Je te laisse le soin de réfléchir à une implémentation plus sérieuse...



Avatar
Bruno Desthuilliers

Ce que je veux manipuler c'est quelquechose comme ça (une structure
hiérarchique) : je ne crois pas pouvoir le faire avec des listes.

direction
|
---secretariat
|
sec_dir
|
---r&d
|
---recherche
|


(snip)


En fait, je lis les infos suivantes :


Dans une arborescence de fichiers ?

logistique
direction/secretariat/sec_dir
direction/r&d
direction/recherche/veille
direction/dev/python/zope
direction/dev/python/integration
direction/dev/python/scient
direction/dev/perl

et je veux écrire le fixhier XML correspondant.


A tu vraiment besoin d'un arbre pour ça ? Qu'est-ce qui t'empêche de
générer ton XML au fur et à mesure ? Je fais ça à longueur d'année pour
générer des menus ou des plans de sites en HTML, et c'est assez trivial.

Avatar
Do Re Mi chel La Si Do
Bonsoir !


J'aime bien le terme "référence". Ça me plait, ce mot.
Donc, à partir de dorénavant, sans tarder, ni plus attendre, je dirai : "Une
'variable' Python est un nom qui référence un objet".


@-salutations
--
Michel Claveau
Avatar
Gael
En fait, je lis les infos suivantes :



Dans une arborescence de fichiers ?


Non, plutôt dans un fichier plat (peu importe en fait).

logistique
direction/secretariat/sec_dir
direction/r&d
direction/recherche/veille
direction/dev/python/zope
direction/dev/python/integration
direction/dev/python/scient
direction/dev/perl

et je veux écrire le fixhier XML correspondant.



A tu vraiment besoin d'un arbre pour ça ? Qu'est-ce qui t'empêche de
générer ton XML au fur et à mesure ? Je fais ça à longueur d'année pour
générer des menus ou des plans de sites en HTML, et c'est assez trivial.


Je ne doute pas que ce soit trivial ... n'empêche que je sais pas le faire.
Je ne peux pas écrire au fur et à mesure, car je jeux trier chaque
arborescence et sous arborescence par ordre alphabétique, en plus mon
exemple est peut être mal choisi, mais si la derniere ligne lue est :

/logistique/item1/item2

je dois écrire:

<node "logistique">
<node "item1">
<node "item2/>
</node>
</node>

or en écrivant au fur et à mesure j'aurais déjà écrit:
<node "logistique/> en première ligne.

Donc oui, il me semble avoir besoin d'un arbre.


1 2