Partage
  • Partager sur Facebook
  • Partager sur Twitter

Parcourir de liste de dictionnaire

Sujet résolu
    18 novembre 2011 à 20:25:34

    Bonjour, je travail actuellement sur un script python qui genère des liste de tableau [{},{},{}]
    Chaque dictionnaire contient des clé tels que 'id' et 'nom'.
    J'ai besoin de récupéré le 'nom' correspondant à l'id' (mais donc pas forcement à l'indice du dictionnaire dans la liste.
    Exemple :
    id recherche = 2745
    id correspondant = 25

    Je voulais éviter d'avoir à parcourir chaque dictionnaire, car il peut y en avoir beaucoup est l'opération serait alors longue, et peu efficace.
    Y'a t'il un autre moyen de faire ca ?
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2011 à 20:35:38

      Ta description est plutôt confuse. Qu'est-ce que tu cherches à faire exactement ? Je crois comprendre que tu veux récupérer la valeur de la clé nom du dictionnaire qui a la valeur X associé à la clé id. Je n'ai pas compris l'histoire avant "id recherche" et "id correspondant".
      • Partager sur Facebook
      • Partager sur Twitter
        18 novembre 2011 à 20:39:34

        Ça me paraît bancal comme modélisation des données.

        Tu pourrais expliquer ton problème de base (ce que tu cherches à modéliser) en détail de manière qu'on puisse voir si tu n'as pas plus simple ?

        Déjà, si tous tes dictionnaires ont chacun à chaque fois exactement deux champs, c'est que le choix du dictionnaire comme structure est erroné (y'a qu'en Perl qu'on verrait un truc pareil)…
        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          18 novembre 2011 à 20:43:24

          Les dictionnaires possèdent chacun plus ou moins 15 champs.
          En faite, ce n'est pas l'id correspondant au dictionnaire qui m’intéresse (sinon il me suffirait de recuperer list[id], mais plus l'id contenu dans le dictionnaire.

          Merci pour vos réponses rapides.
          • Partager sur Facebook
          • Partager sur Twitter
            18 novembre 2011 à 20:44:11

            Peux-tu donner un exemple ?
            • Partager sur Facebook
            • Partager sur Twitter
              18 novembre 2011 à 20:45:35

              Citation : necromoine

              Les dictionnaires possèdent chacun plus ou moins 15 champs.
              En faite, ce n'est pas l'id correspondant au dictionnaire qui m’intéresse (sinon il me suffirait de recuperer list[id], mais plus l'id contenu dans le dictionnaire.



              Ta description est encore insuffisante. Je me répète : peux-tu nous expliquer ton problème de base (ce que tu cherches à modéliser) en détail s'il te plait ?
              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
              Anonyme
                18 novembre 2011 à 20:47:20

                Si tu nous mettais un exemple d'entrée sortie, car j'ai tendance lorsque je te lis à confondre l'id ta clé de dico et l'id identificateur de l'objet.

                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2011 à 21:15:06

                  Voilà l'exemple d'un clé du dictionnaire:
                  {u'SongID': 27013856, u'IsLowBitrateAvailable': 1, u'IsVerified': 1, u'AvgRating': 0, u'Popularity': 1130100149, u'CoverArtFilename': u'4944605.jpg', u'Score': 131072.98642627, u'AlbumName': u'Something You Might Like', u'TrackNum': 1, u'ArtistCoverArtFilename': u'923472.jpg', u'AlbumID': 4944605, u'ArtistID': 923472, u'AvgDuration': 0, u'Flags': 0, u'EstimateDuration': 0, u'ArtistName': u'Puggy', u'Year': u'2010', u'TSAdded': u'1283624920', u'GenreID': 288, u'SongName': u'When You Know'}

                  Désolé mais je n'étais pas sur mon PC avant.
                  Merci pour votre aide
                  l'id que je veux comparer est donc SongId
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 novembre 2011 à 21:18:18

                    Déjà, pourquoi tu utilises des dictionnaires et pas tout bêtement des classes ou mieux, des namedtuples ?

                    Dans le second cas, ce serait déjà beaucoup plus efficace.

                    Et il te suffirait juste, ensuite, de ranger ces namedtuples dans un dictionnaire qui les indexe par leur SongID.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      18 novembre 2011 à 21:19:33

                      C'est un dictionnaire crée par réponse d'une requete JSON :
                      j = json.JSONDecoder().decode(gzipfile.read())
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        18 novembre 2011 à 21:23:40

                        Citation

                        l'id que je veux comparer est donc SongId



                        J'ai rien compris! Le comparer à quoi?

                        Citation : fred1599

                        Si tu nous mettais un exemple d'entrée sortie



                        Il est où l'exemple de sortie?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 novembre 2011 à 21:27:10

                          Et alors ?

                          >>> from collections import namedtuple
                          >>> Record = namedtuple('Record', 'SongID IsLowBitrateAvailable IsVerified AvgRating Popularity CoverArtFilename Score AlbumName TrackNum ArtistCoverArtFilename AlbumID ArtistID AvgDuration EstimateDuration ArtistName Year TSAdded GenreID SongName Flags')
                          >>> dico = {u'SongID': 27013856, u'IsLowBitrateAvailable': 1, u'IsVerified': 1, u'AvgRating': 0, u'Popularity': 1130100149, u'CoverArtFilename': u'4944605.jpg', u'Score': 131072.98642627, u'AlbumName': u'Something You Might Like', u'TrackNum': 1, u'ArtistCoverArtFilename': u'923472.jpg', u'AlbumID': 4944605, u'ArtistID': 923472, u'AvgDuration': 0, u'Flags': 0, u'EstimateDuration': 0, u'ArtistName': u'Puggy', u'Year': u'2010', u'TSAdded': u'1283624920', u'GenreID': 288, u'SongName': u'When You Know'}
                          >>> rec = Record(**dico)
                          >>> rec.SongID
                          27013856
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            18 novembre 2011 à 21:35:15

                            L'utilisateur rentre un nom de musique, qu'il passe en paramètre à la fonction recherche
                            recherche(SongName)
                            Le script prend ce nom, la traite, et retourne une liste de dictionnaire comme celui posté plus haut, en fonction du nombre de chanson retournée.
                            Ensuite, l'utilisateur (qui a maintenant les id de la chanson qu'il veut isoler), peut appeler l'autre fonctione, isole(songID), mais cette fonction doit récupérer les informations dans le tableau généré par la fonctione recherche pour l'id entré par l'utilisateur.
                            Ainsi les étapes se déroule suivant le schema :
                            recherche('groupe')
                            1. Groupe chanson 1 id : 2745
                            2. Groupe chanson 2 id : 24
                            La liste généré est alors :
                            liste = [{u'SongID': 2745, u'IsLowBitrateAvailable': 1, u'IsVerified': 1, u'AvgRating': 0, u'Popularity': 1130100149, u'CoverArtFilename': u'2745.jpg', u'Score': 131072.98642627, u'AlbumName': u'Something You Might Like', u'TrackNum': 1, u'ArtistCoverArtFilename': u'2745.jpg', u'AlbumID': 4944605, u'ArtistID': 923472, u'AvgDuration': 0, u'Flags': 0, u'EstimateDuration': 0, u'ArtistName': u'Puggy', u'Year': u'2010', u'TSAdded': u'1283624920', u'GenreID': 288, u'SongName': u'Group 1 Chanson1'}, {u'SongID': 24, u'IsLowBitrateAvailable': 1, u'IsVerified': 1, u'AvgRating': 0, u'Popularity': 1130100149, u'CoverArtFilename': u'24.jpg', u'Score': 131072.98642627, u'AlbumName': u'Something You Might Like', u'TrackNum': 1, u'ArtistCoverArtFilename': u'24.jpg', u'AlbumID': 4944605, u'ArtistID': 923472, u'AvgDuration': 0, u'Flags': 0, u'EstimateDuration': 0, u'ArtistName': u'Puggy', u'Year': u'2010', u'TSAdded': u'1283624920', u'GenreID': 288, u'SongName': u'chanson2'}]
                            ect
                            Ensuite l'utilisateur veut des détails sur la chanson 1:
                            isoler(2745)
                            La fonction se charge alors de parcourir liste jusqu'a ce que liste[i][songId] soit égal à 2745 (dans notre cas, c'est le premier dictionnaire, elle peut alors afficher les details:
                            print 'Nom : ' + liste[i]['SongName']

                            Voilà j'espère avoir été clair, désolé

                            EDIT :
                            j'ai compris le principe des namedtuple (c'est un peu l'equivalent d'un array to object en PHP si je ne me trompe pas, mais après, tu dis de
                            Et il te suffirait juste, ensuite, de ranger ces namedtuples dans un dictionnaire qui les indexe par leur SongID.
                            Et c'est là que je bloque.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 novembre 2011 à 21:48:14

                              Bah c'est dommage d'utiliser une liste de dictionnaires pour ça, m'enfin si on reprend ta structure telle quelle :

                              >>> hashmap = {elt['SongID']: elt for elt in liste}
                              >>> # ou bien si tu as une version plus ancienne de python 
                              >>> # qui ne supporte pas les dict comprehensions:
                              >>> hashmap = dict(((elt['SongID'], elt) for elt in liste))
                              >>> hashmap[2745]['SongName']
                              u'Group 1 Chanson1'
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Zeste de Savoir, le site qui en a dans le citron !
                                18 novembre 2011 à 22:16:06

                                Merci, c'est exactement ce qu'il me fallait, et en plus j'ai découvert les namedtuples, et l'opération est assez rapide, meme avec plus de 250 résultats.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Parcourir de liste de dictionnaire

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown