Dict Inverse en Python
-
05-07-2019 - |
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?
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()]