Comment inverser un dictionnaire qu'il a répété des valeurs
-
26-09-2019 - |
Question
Alors, j'ai un dictionnaire avec près de 100 000 (clés, valeurs) paires et la majorité des clés mapper les mêmes valeurs. Par exemple imaginer quelque chose comme ça:
mydict = {'a': 1, 'c': 2, 'b': 1, 'e': 2, 'd': 3, 'h': 1, 'j': 3}
Ce que je veux faire, est d'inverser le dictionnaire de telle sorte que chaque valeur mondict va être une clé au reverse_dict et va mapper une liste de tous les mydict.keys qui sert à la carte à cette valeur au mondict. Ainsi, en fonction de l'exemple ci-dessus, je recevrais:
reversed_dict = {1: ['a', 'b', 'h'], 2:['e', 'c'] , 3:['d', 'j']}
Je suis venu avec une solution qui est très cher et je voudrais vraiment entendre des idées plus efficace que le mien.
ma solution coûteuse:
reversed_dict = {}
for value in mydict.values():
reversed_dict[value] = []
for key in mydict.keys():
if mydict[key] == value:
if key not in reversed_dict[value]: reversed_dict[value].append(key)
Output >> reversed_dict = {1: ['a', 'b', 'h'], 2: ['c', 'e'], 3: ['d', 'j']}
J'apprécierais vraiment d'entendre des idées mieux et plus efficace que de la mienne. Merci!
La solution
from collections import defaultdict
reversed_dict = defaultdict(list)
for key,value in mydict.iteritems():
reversed_dict[value].append(key)
S'il vous plaît ne pas utiliser dict comme une variable, cette fonction entre en collision avec dict ()
Autres conseils
Je pense que vous perdez quelques cycles en remplaçant une clé avec la même touche encore et encore ...
reversed_dict = {}
for value in mydict.values():
if value not in reversed_dict.keys(): #checking to be sure it hasn't been done.
reversed_dict[value] = []
for key in mydict.keys():
if mydict[key] == value:
if key not in reversed_dict[value]: reversed_dict[value].append(key)
for k,v in dict.iteritems():
try:
reversed_dict[v].append(k)
except KeyError:
reversed_dict[v]=[k]
reversed_dict = collections.defaultdict(list)
for key, value in dict_.iteritems():
reversed_dict[value].append(key)
Utilisation itertools.groupby
:
from operator import itemgetter
from itertools import groupby
snd = itemgetter(1)
def sort_and_group(itr, f):
return groupby(sorted(itr, key=f), f)
mydict = {'a': 1, 'c': 2, 'b': 1, 'e': 2, 'd': 3, 'h': 1, 'j': 3}
reversed_dict = {number: [char for char,_ in v]
for number, v in sort_and_group(mydict.items(), snd)}