J'ai un dictionnaire avec une paire de près de 100 000 (clé, une valeur) et la majorité de la carte des clés aux mêmes valeurs. Par exemple:
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)
6 Réponses :
Vous voudrez peut-être utiliser defaultDict (SET) code> et remplacer append () code> avec ajouter () code>. Cela supprimerait les doublons, mais garder les valeurs UNIQ.
reversed_dict = collections.defaultdict(list) for key, value in dict_.iteritems(): reversed_dict[value].append(key)
for k,v in dict.iteritems():
try:
reversed_dict[v].append(k)
except KeyError:
reversed_dict[v]=[k]
Je pense que vous gaspillez quelques cycles en remplaçant une clé avec la même clé 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)
Utilisation de iTERTOOLS.GROUPBY CODE>: 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)}
reversed_dict = {}
for key, value in mydict.items():
reversed_dict.setdefault(value, [])
reversed_dict[value].append(key)
Vous pouvez même faire les deux opérations sur une ligne: inversé_dict.setdefault (valeur, []). Ajoutez (clé) code>