Je cherche une méthode sur un dictionnaire (ou une solution simple) qui peut retourner des combinaisons clé / valeur.

dictionary = {'foo': ['bar', 'baz'],
              'spam': ['eggs']}

Ce que je veux, ce sont des combinaisons des paires de valeurs clés qui déballent également les listes.

Ex:

'foo', 'bar'
'foo', 'baz'
'spam', 'eggs'

tuples = []
for key in dictionary:
    for value in dictionary.get(key):
        tuples.append((key, value))

Ce qui précède fonctionne, mais je suis curieux de savoir s'il existe une méthode itertool ou dictionnaire existante qui peut répliquer ces boucles.

0
atheis4 11 avril 2018 à 10:51

5 réponses

Meilleure réponse
>>> dictionary
{'foo': ['bar', 'baz'], 'spam': ['eggs']}
>>> [(k, v) for k, l in dictionary.items() for v in l]
[('foo', 'bar'), ('foo', 'baz'), ('spam', 'eggs')]

Bien sûr, cela fonctionne également comme un générateur ou dans tout autre contexte dont vous avez besoin.

3
deceze 11 avril 2018 à 07:55

Une autre façon facile pour les débutants :

dictionary = {'foo': ['bar', 'baz'], 'spam': ['eggs']}

for key, value in dictionary.items():
    for item in value:
        print((key, item))

notez l'utilisation de parenthèses pour créer un tuple en sortie.

0
novonimo 11 avril 2018 à 08:05

Essaye ça.

for key in dictionary:
    for item in dictionary[key]:
        print key, item
0
Ashwani Shakya 11 avril 2018 à 07:56

Utilisation du yield pour écrire un générateur.

Au lieu d'avoir les sorties remplies en mémoire sous forme de liste. la fonction unpack crée la sortie requise à la volée, ce qui est très utile s'il y a un grand nombre de clés dans le dictionnaire.

mydict = {'foo': ['bar', 'baz'],
      'spam': ['eggs']}

def unpack(dictionay):
    for key, values in dictionay.items():
        for val in values:
            yield key,val 

for k, v in unpack(mydict):
    print k, v
0
Venkatesh Mondi 11 avril 2018 à 10:11

Ce n'est pas une fonctionnalité intégrée, mais vous pouvez y parvenir très facilement.

mydict = {'foo': ['bar', 'baz'],
          'spam': ['eggs']}

for key, value in ((k,v) for (k, vs) in mydict.items() for v in vs):
     print(key, value)

Ou pour les obtenir sous forme de liste

items = [(k, v) for (k,vs) in mydict.items() for v in vs]
1
khelwood 11 avril 2018 à 07:56