Forum Programmation.python Tri dans un dictionnaire de liste

Posté par  .
Étiquettes : aucune
0
16
nov.
2006
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!
  • # beh ca

    Posté par  (site web personnel) . É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
    • [^] # Re: beh ca

      Posté par  (site web personnel) . Évalué à 2.

      autant pour moi, j'ai mal compris la question. je vais maintenant réfléchir à la *vraie* question :)
      • [^] # Re: beh ca

        Posté par  (site web personnel) . É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
        • [^] # Re: beh ca

          Posté par  . É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  . É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à.
  • # zip, sort, unzip

    Posté par  (site web personnel) . É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  . É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  . É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

Suivre le flux des commentaires

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