OVH Cloud OVH Cloud

ordre création dictionnaire

6 réponses
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonjour !

Soit le code suivant :

ui={}
ui['B1']=1
ui['B3']=1
ui['B2']=1
ui['B4']=1
ui['B5']=1
print ui # {'B4': 1, 'B5': 1, 'B1': 1, 'B2': 1, 'B3': 1}

Je ne comprend pas la logique de l'ordre des éléments créés dans le
dictionnaire. Si je veux conserver l'ordre de création, dois-je maintenir
une liste séparée ? Y a-t'il une astuce ?

@+
--
Michel Claveau

6 réponses

Avatar
Marc
Le 27/12/2004 13:05, dans 41cffaae$0$11534$,
« Michel Claveau - abstraction méta-galactique non triviale en fuite
perpétuelle. » a écrit :

print ui # {'B4': 1, 'B5': 1, 'B1': 1, 'B2': 1, 'B3': 1}

Je ne comprend pas la logique de l'ordre des éléments créés dans le
dictionnaire. Si je veux conserver l'ordre de création, dois-je maintenir
une liste séparée ? Y a-t'il une astuce ?


Bonjour,

Tout nouveau en python (et donc avec une lecture toute fraîche du tutorial),
il me semble que les dictionnaire ne sont pas ordonnés en séquence comme les
listes. Je ne sais rien de la raison de l'ordre donné en ex., mais en tout
cas on ne doit pas compter sur l'ordonnancement d'un dico.
Je suppose que si on veut un couple ordonné de clé:valeur il faudrait
utiliser une liste de duplets comme:
ui=[['B1', 1], ['B2', 2], etc]
ou combiner une liste de clés simples et un dico:
ui_index=['B1', 'B2', ...]
ui={'B1':1, 'B2':2, ...}

Bonne année!
Marc

Avatar
Yermat
Michel Claveau - abstraction méta-galactique non triviale en fuite
[...]
Je ne comprend pas la logique de l'ordre des éléments créés dans le
dictionnaire.


Normal, il y en a pas (enfin, si ce n'est l'implémentation...)

Si je veux conserver l'ordre de création, dois-je maintenir
une liste séparée ? Y a-t'il une astuce ?


Oui. Voir par exemple :
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747

Ou encore cherche "python ordered dictionary" sous Google !

--
Yermat

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Aaaarrrgghh !

L'ordre de l'implémentation est bien fait (il n'y a qu'à voir les
différences de performances, avec les listes, avec des (très) grands
ensembles de données). Après quelques essais, il m'a bien semblé distinguer
un arbre positionnel.
Mais, bon, je suppose que, si l'ordre n'est pas communiqué, c'est qu'il est
susceptible d'évoluer, dans le futur (ou selon les implémentations).

Evidemment, en faisant une classe (qui hérite de UserDict), qui associe une
liste (des clefs) aux valeurs, on contourne le problème. Mais c'est un poil
lourd.

Enfin, je suppose ne pas avoir le choix. Ceci dit, avec Python, ça doit
pourvoir implémenter assez facilement.

Merci pour l'info.
--
Michel Claveau
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Re

Bon, c'est fait, et ça fonctionne. Du coup, je vais ajouter quelques
fonctions à la classe (ordre réciproque)

Bonne nuit
--
Michel Claveau
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonsoir !

J'ai fait une classe, qui hérite de UserDict, et gère une liste des clefs.
Je me suis inspiré du CookBook (voir le lien donné par Yermat).

20 minutes, chrono en main. Vive Python !

Michel Claveau
Avatar
mordicus
Michel Claveau - abstraction méta-galactique non triviale en fuite
perpétuelle. wrote:

Bonjour !

Soit le code suivant :

ui={}
ui['B1']=1
ui['B3']=1
ui['B2']=1
ui['B4']=1
ui['B5']=1
print ui # {'B4': 1, 'B5': 1, 'B1': 1, 'B2': 1, 'B3': 1}

Je ne comprend pas la logique de l'ordre des éléments créés dans le
dictionnaire. Si je veux conserver l'ordre de création, dois-je maintenir
une liste séparée ? Y a-t'il une astuce ?

@+


C'est une table de hachage, il n'y a pas d'ordre precis avec ca, c'est
normal.