Question

J'essaie de créer un nouveau dict en utilisant la liste des valeurs d'un dict existant sous forme de clés individuelles.

Ainsi, par exemple:

dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})

et je voudrais obtenir:

dict2 = dict({1:['a','b','c'], 2:['a','b','c'], 3:['a','b'], 4:['b']})

Jusqu'à présent, je n'ai pas été capable de le faire de manière très propre. Des suggestions?

Était-ce utile?

La solution

Si vous utilisez Python version 2.5 ou ultérieure, utilisez le defaultdict classe du module collections ; Un defaultdict crée automatiquement des valeurs lors du premier accès à une clé manquante. Vous pouvez donc l'utiliser ici pour créer les listes de dict2 , comme ceci:

from collections import defaultdict
dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})
dict2 = defaultdict(list)
for key, values in dict1.items():
    for value in values:
        # The list for dict2[value] is created automatically
        dict2[value].append(key)

Notez que les listes dans dict2 ne seront pas dans un ordre particulier, car les dictionnaires ne classent pas leurs paires clé-valeur.

Si vous voulez un dict out ordinaire à la fin qui générera un KeyError pour les clés manquantes, utilisez simplement dict2 = dict (dict2) après ce qui précède.

Autres conseils

Notez que vous n'avez pas besoin du dict dans vos exemples: la syntaxe {} vous donne un dict:

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}

Autre moyen:

dict2={}
[[ (dict2.setdefault(i,[]) or 1) and (dict2[i].append(x)) for i in y ] for (x,y) in dict1.items()]  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top