Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Une liste dans un dictionnaire ?

Une liste dans un dictionnaire ?

Remonter à Forum général Python
  • Une liste dans un dictionnaire ?

    Envoyé par frog le 19 Septembre 2006 à 09:51
    Bonjour,

    Je souhaite créer un dictionnaire à partir du code suivant :


    myList = (('U2', 'War'), ('Queen', 'A Kind of Magic'), ('U2', 'Achtung Baby'))
    myResult=dict([(x[0], x[1]) for x in myList])
    print myResult


    Malheureusement j'obtiens...
    :( {'Queen': 'A Kind of Magic', 'U2': 'Achtung Baby'}
    ... alors que j'aimerais obtenir quelque chose comme...
    :) {'Queen': 'A Kind of Magic', 'U2': ('Achtung Baby', 'War')}

    Quelqu'un a une idée ?
    • Re: Une liste dans un dictionnaire ?

      Envoyé par brouss le 19 Septembre 2006 à 11:13
      #! /usr/bin/python2.4


      myList = (('Nofx', 'The Brews'), ('Bad Religion', 'American Jesus'), ('Nofx', 'Eat The Meek'))

      myDic = {}

      for x in myList:
      (clef, val) = x
      if myDic.has_key(clef):
      myDic[clef].append(val)
      else: myDic[clef] = [val]


      print myDic


      damned! je n'arrive pas à mettre de tabulations! de plus les listes vides ne passent pas...
      à l'avant derniere ligne il faut lire else: myDic=["liste vide"]
    • Re: Une liste dans un dictionnaire ?

      Envoyé par fraoustin le 19 Septembre 2006 à 11:14
      le retour de python est normal puisque dans un dictionnaire une clé ne peux retourner qu'une valeur et que ton code revient à faire:

      myResult['U2']= 'War'
      myResult['U2']= 'Achtung Baby'

      on pourrait imaginer un truc comme cela

      myList = (('U2', 'War'), ('Queen', 'A Kind of Magic'), ('U2', 'Achtung Baby'))
      l=[]
      myResult={}
      for i in myList:
      l.append(i[0])
      l.sort()
      old=""
      for j in l:
      if old != j:
      list=[]
      for x in myList:
      if x[0] == j: list.append(x[1])
      myresult[j]=list
      old=j

    • Re: Une liste dans un dictionnaire ?

      Envoyé par bader le 19 Septembre 2006 à 11:45
      Au lieu de passer par une list comprehension inutile dans ce cas précis tu peux faire ça:
      dict(taliste) mais tu perds le fait d'avoir plus d'un élément pour une clef.

      La solution de brouss me paraît donc la plus évidente.
    • Re: Une liste dans un dictionnaire ?

      Envoyé par frog le 19 Septembre 2006 à 11:58
      OK, merci à tous !

      Un de mes frangins qui programme aussi en Python m'a suggéré la méthode suivante :

      myList = [('U2', 'War'), ('Queen', 'A Kind of Magic'), ('U2', 'Achtung Baby')]
      myResult={}

      for key,val in myList :
      if key in myResult :
      myResult[key].append(val)
      else :
      myResult[key] = [val,]

      print myResult


      Note pour Brouss :
      Qd tu veux mettre du code, le + simple c'est de le délimiter par [ code ] et [ / code ] (sans les espaces)
    • Re: Une liste dans un dictionnaire ?

      Envoyé par frog le 19 Septembre 2006 à 12:00
      Oups, voici le code :
      myList = [('U2', 'War'), ('Queen', 'A Kind of Magic'), ('U2', 'Achtung Baby')]
      myResult={}

      for key,val in myList :
      if key in myResult :
      myResult[key].append(val)
      else :
      myResult[key] = [ val,]

      print myResult
    • Re: Une liste dans un dictionnaire ?

      Envoyé par brouss le 19 Septembre 2006 à 12:32
      Ce programme ne va pas. Tu ne donnes pas la clef au dictionnaire myResult. Le résultat final sera juste une liste d'un seul élément (le dernier val).
      Par contre si tu rajoutes les clefs (myResult[key].append(val) et myResult[key]=[val]) c bon. Mais c pareil que le code ke je t'ai passé!

      note: merci pour l'info pour [ code] [ /code]
    • Re: Une liste dans un dictionnaire ?

      Envoyé par frog le 19 Septembre 2006 à 16:56
      En fait mon code est bon, mais qd je l'ai collé certains bouts on disparus... (si on ne met pas d'espace après un "[" , ce dernier disparait quand on enregistre le post)

      En effet, le bon code est sensé être :


      myList = [('U2', 'War'), ('Queen', 'A Kind of Magic'), ('U2', 'Achtung Baby')]
      myResult={}

      for key,val in myList :
      if key in myResult :
      myResult[ key].append(val)
      else :
      myResult[ key] = [ val,]

      print myResult


      Avant de lire ton post, je pensais aussi mettre un "has_key" mais à ce qu'on m'a dit, "if key in myResult" est plus rapide que "if myResult.has_key(key)"... bon, sur des p'tites listes comme là, ça ne doit pas changer grand chose...

      • Re: Une liste dans un dictionnaire ?

        Envoyé par kerflyn le 21 Septembre 2006 à 05:30
        'setdefault' permet de gagner un peu de place :


        myList = [('U2', 'War'), ('Queen', 'A Kind of Magic'), ('U2', 'Achtung Baby')]
        myResult = {}

        for key, val in myList:
        myResult.setdefault(key, [ ]).append(val)

        print myResult


        Sinon, avec la version 2.5, tu peux utiliser 'defaultdict' du module collections (http://docs.python.org/dev/lib/defaultdict-objects.html).
    • Re: Une liste dans un dictionnaire ?

      Envoyé par frog le 21 Septembre 2006 à 08:32
      Merci Kerflyn
      En effet on peut difficilement faire plus court !
      Frog
    • Re: Une liste dans un dictionnaire ?

      Envoyé par brouss le 21 Septembre 2006 à 08:55
      Je ne connaissais pas le setdefault, c'est bon à savoir!!!
Rendu par Ploneboard