Retourner aux forums || Retourner au forum Programmation.python

Programmation.python : Tri dans un dictionnaire de liste

Posté par Gilles G. () le 16 novembre 2006
0
Bonjour,
j'utilise un dictionnaire pour stocker des informations sous forme de liste pour chaque champ. Il s'agit des propriétés des modes d'une pièce:

modes = {'fréquence':[12, 3, 24], 'coef':[1, 2, 3]}

et je voudrais trier ce dictionnaire en fonction de la fréquence pour obtenir:

modes = {'fréquence':[3, 12, 24], 'coef':[2, 1, 3]}

Je souhaite éviter de recourir à la définition d'un classe mode, car je voudrais ensuite pouvoir convertir les listes de mon dictionnaire en array.

Voilà. C'est peut-être une question triviale, mais je ne trouve pas de solution élégante. Pour l'instant, je fais la copie du champ 'fréquence' et je suis obligé de faire un nouveau dictionnaire qui contient les modes triés.

Merci d'avance!

> Lire le message (8 commentaires, moyenne: 2,8).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

beh ca

Posté par cho7 (page perso, ) le 16/11/2006 à 08:36. (lien). Évalué à 2.


for cle in modes: modes[cle].sort()

ya ptetre une methode plus short, mais en attendant ca te résoud ton problème, et sans copie

--
le python, c'est bon
  • [^]Re: beh ca

    Posté par cho7 (page perso, ) le 16/11/2006 à 08:37. (lien). Évalué à 2.

    autant pour moi, j'ai mal compris la question. je vais maintenant réfléchir à la *vraie* question :)

    --
    le python, c'est bon
    • [^]Re: beh ca

      Posté par cho7 (page perso, ) le 16/11/2006 à 09:01. (lien). Évalué à 2.

      bon finalement j'ai pas mal de boulot ce matin :)

      Mais j'avais commencé à chercher du coté de la modification de la fonction sort() :

      def maFonctionDeTri(val1,val2):
      #ici trouver comment retourner 1 ou 0 selon les cas

      modes["coef"].sort(maFonctionDeTri)

      Hope this helps

      --
      le python, c'est bon
      • [^]Re: beh ca

        Posté par Gilles G. () le 16/11/2006 à 09:50. (lien). Évalué à 2.

        Ok, merci pour ton aide.
        Je vois que ma question n'était pas si simple. Je verrais ce soir si je peux faire quelque chose dans ce genre.

        Si quelqu'un a d'autres idées, je suis preneur.

idée

Posté par Plop () le 16/11/2006 à 09:35. (lien). Évalué à 4.

Ta méthode de représentation n'est pas top, top puisque implicitement, tu n'as pas d'association entre tes coef et tes fréquences.

Ce que je ferais :

>>> modes = {'f':[12, 3, 24], 'c':[1, 2, 3]}
# création d'un tableau o temporaire.
>>> o=[]
>>> for i in xrange(len(modes['f'])):
... o.append([modes['f'][i],modes['c'][i]])
...
>>> o
[[12, 1], [3, 2], [24, 3]]
>>> o.sort()
>>> o
[[3, 2], [12, 1], [24, 3]]

# remise en forme.
>>> modes={'f':[],'c':[]}
>>> for i in o:
... modes['f'].append(i[0])
... modes['c'].append(i[1])
...
>>> modes
{'c': [2, 1, 3], 'f': [3, 12, 24]}

et voilà.

--
http://linuxfr.org/board <-- des moules, du sang, de la violence

zip, sort, unzip

Posté par Ernest H (Jabber id, ) le 16/11/2006 à 09:45. (lien). Évalué à 5.

Ce que je ferais, c'est de trier la liste des tuples frequence/coef, et ensuite de remettre les valeurs obtenues dans le dictionnaire :


modes = {'f':[12, 3, 24], 'coef':[1, 2, 3]}
fc = zip(modes['f'], modes['coef']) # fc est la liste de tuples
fc.sort() # fc est maintenant triée suivant le premier argument du tuple
modes['f'] = [i for (i, _) in fc]
modes['coef'] = [j for (i,j) in fc]


Le unzip que j'ai fait est probablement très mauvais, mais je n'ai pas cherché mieux.

  • [^]Re: zip, sort, unzip

    Posté par Gilles G. () le 16/11/2006 à 10:05. (lien). Évalué à 2.

    Chouette!!
    J'aime beaucoup cette solution, je la trouve très élégante. Le seul inconvénient c'est qu'on doit toujours faire appelle à une variable intermédiaire mais tant pis...

    Merci à tous!

  • [^]Re: zip, sort, unzip

    Posté par gaaaaaAab () le 16/11/2006 à 13:45. (lien). Évalué à 3.

    cool la fonction "zip", je connaissais pas encore =)

    sinon, pour le unzip, j'aurais plus fait un :

    modes['f'] = [ i[0] for i in fc ]
    modes['coef'] = [ i[1] for i in fc ]

    qui me parait plus lisible

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.python