Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/03/2018, à 20:46

Hizoka

[Résolu] [python3] 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... roll

Petit exemple :

# 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"]}
albumsBis = {}
sortBy = ["genre", "year"]

# 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 :

{
  Artist:
  {
    genre:
    {
      year: [albums]
    }
  }
}

Soit dans l'exemple :

{
  "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...

Enfin voilà... désolé pour cette demande relativement basique...

Merci à vous smile

Dernière modification par Hizoka (Le 19/03/2018, à 12:21)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 19/03/2018, à 12:22

Hizoka

Re : [Résolu] [python3] Boucle while traitant des infos d'un dico

On m'a proposé 2 belles solutions ici : https://www.developpez.net/forums/d1830 … os-d-dico/

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)

et

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) 

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)

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne