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!

Était-ce utile?

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)}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top