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 712
    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 712
    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