IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Boucle while traitant des infos d'un dico [Python 3.X]


Sujet :

Python

  1. #1
    Membre chevronn�
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par d�faut Boucle while traitant des infos d'un dico
    Bonsoir � vous,

    mon cerveau a d� surchauffer car l� je suis bloqu� par un truc tout con...

    Petit exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # liste de dictionnaire contenant des infos sur un album
    zic = {"album1" : { "id":"1", "artist": "svinkels", "year": "2000", "genre": "rap" },
    "album5" : { "id":"5", "artist": "svinkels", "year": "2000", "genre": "punk" },
    "album4" : { "id":"4", "artist": "svinkels", "year": "2001", "genre": "punk" },
    "album8" : { "id":"8", "artist": "svinkels", "year": "2001", "genre": "rap" },
    "album7" : { "id":"7", "artist": "tryo", "year": "2000", "genre": "reggae" },
    "album3" : { "id":"3", "artist": "tryo", "year": "2000", "genre": "reggae" },
    "album2" : { "id":"2", "artist": "tryo", "year": "2001", "genre": "variete" },
    "album6" : { "id":"6", "artist": "tryo", "year": "2001", "genre": "variete" }}
     
    # Dictionnaire qui a trié les albums par artist
    albums = {"svinkels": ["album1", "album4", "album5", "album8"], "tryo": ["album2", "album3", "album6", "album7"]}
     
    sortBy = ["genre", "year"]
    et moi je voudrais arriver � un dico :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
      Artist:
      {
        genre:
        {
          year: [albums]
        }
      }
    }
    Soit dans l'exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
      "svinkels": 
      {
        "rap":
        {
          "2000": ["album1"],
          "2001": ["album8"]
        },
       "punk":
        {
          "2000": ["album5"],
          "2001": ["album4"]
        }
      }
      "tryo": 
      {
        "variete":
        {
          "2001": ["album7", "Album3"]
        },
       "reggae":
        {
          "2000": ["album2", "Album6"]
        }
      }
    }
    Je l'ai d�j� fait mais l�... je suis trop fatigu� je crois...

    il faut boucler sur la liste sortBy, et avoir une autre boucle infinie qui rajoute un niveau de profondeur � chaque fois...
    ou passer via une fonction qui s'appelle elle m�me � chaque sous niveau...
    car le but �tant de faire autant de niveau que d'element dans la liste sortBy.

    Enfin voil�... d�sol� pour cette demande relativement basique... mais l� je tourne en rond...

    Merci � vous

  2. #2
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 772
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activit� : Architecte technique retrait�
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par d�faut
    Salut,

    Citation Envoy� par hizoka Voir le message
    Enfin voil�... d�sol� pour cette demande relativement basique... mais l� je tourne en rond...
    J'�crirais cela ainsi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dd = {}
    for album, data in zic.items():
        artist, *items = [ data[z] for z in [ 'artist' ] + sortBy ]
        entry = dd.setdefault(artist, {})
        for z in items[:-1]:
            entry.setdefault(z, {})
            entry = entry[z]
        entry.setdefault(items[-1], []).append(album)
    print(dd)
    nota, pas de while l� dedans.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert

    Homme Profil pro
    Ing�nieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par d�faut
    Ceci fonctionne bien :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    def add_key_or_create(dico, key_list, val):
      ### /!\ This function modifies the variable dico
      if len(key_list)==1 :
          key = key_list[0]
          if key not in dico : dico[key]=[]
          dico[key].append(val)
      else :
          key = key_list[0]
          if key not in dico : dico[key]={}
          add_key_or_create(dico[key], key_list[1:], val) 
     
    dico = {}
    for artist in albums :
        if not artist in dico : dico[artist]={ }
        for album in albums[artist] :
            keys = [ zic[album][key] for key in sortBy ]
            add_key_or_create(dico[artist], keys , album)
     
    print(dico)
    m�me si faire une fonction qui modifie une variable d'entree n'est pas super propre...
    Pour l'etre il faudrait se faire une classe, qui d�rive de dictionnaire, et qui traduit les cl�s de tuples non pas comme un cl� simple (comme le ferait un dico standard), mais en profondeur en imbriquant les dico.

    NB : Inclure la cl� "artist" dans la liste "sortBy" serait plus �l�gant et plus coh�rent ...
    On aurait ainsi plus simplement :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    sortBy2 = [ "artist", "genre", "year"]
    dico2 = {}
    for artist in albums :
        for album in albums[artist] :
            keys = [ zic[album][key] for key in sortBy2 ]
            add_key_or_create(dico2, keys , album)
     
    print(dico2)
    EDIT : wiztricks a �t� plus rapide que moi pour r�diger son message ! J'avais pas pens� au setdefault beaucoup plus efficace...

  4. #4
    Membre chevronn�
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par d�faut
    Salut,

    un tr�s grand merci � tous les deux !

    @ lg_53 : j'�tais parti dans cette dir�ction, mais il e manquait encore un peu de taf pour faire aussi bien...

    @ wiztricks : je ne connaissais pas setdefault qui est en effet int�ressant.
    Mais c'est une des id�e que j'avais eu en effet d'essayer d'ajouter un niveau via une variable mais je n'y arrivais plus...

    Encore un grand merci � vous les gars !

    Bonne journ�e.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [MySQL] [merci � Nnay ;)]Boucle while + SQL -> Affichage des donn�es
    Par DiPSoMaNiE dans le forum PHP & Base de donn�es
    R�ponses: 5
    Dernier message: 15/01/2009, 11h45
  2. Gestion des erreurs dans une boucle While
    Par Gregory.M dans le forum Macros et VBA Excel
    R�ponses: 1
    Dernier message: 12/08/2008, 20h57
  3. Boucle do while avec des conditions multiples
    Par UrSuS AmErIcAnUs dans le forum C
    R�ponses: 4
    Dernier message: 19/06/2008, 16h13
  4. [MySQL] r�cup�rer les dimensions des images dans une boucle while
    Par Navyel dans le forum PHP & Base de donn�es
    R�ponses: 3
    Dernier message: 26/08/2007, 11h09
  5. R�ponses: 2
    Dernier message: 06/04/2007, 13h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo