Python 如何反转具有重复值的词典
我有一本字典,里面有将近100000对(键,值),大多数键映射到相同的值。例如:Python 如何反转具有重复值的词典,python,dictionary,Python,Dictionary,我有一本字典,里面有将近100000对(键,值),大多数键映射到相同的值。例如: mydict = {'a': 1, 'c': 2, 'b': 1, 'e': 2, 'd': 3, 'h': 1, 'j': 3} 我想做的是反转字典,使mydict中的每个值都成为reverse\u dict的一个键,并映射到所有mydict.keys()中用于映射到mydict中该值的mydict.keys()的列表。根据上面的例子,我会得到: reversed_dict = {1: ['a', 'b',
mydict = {'a': 1, 'c': 2, 'b': 1, 'e': 2, 'd': 3, 'h': 1, 'j': 3}
我想做的是反转字典,使mydict
中的每个值都成为reverse\u dict
的一个键,并映射到所有mydict.keys()
中用于映射到mydict
中该值的mydict.keys()的列表。根据上面的例子,我会得到:
reversed_dict = {1: ['a', 'b', 'h'], 2: ['c', 'e'] , 3: ['d', 'j']}
我提出了一个非常昂贵的解决方案,我想听听有没有比这更有效的方法:
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)
使用:
我认为你一次又一次地用同一把钥匙替换钥匙是在浪费几个周期
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)
使用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)}
您甚至可以在一行上执行这两个操作:reversed\u dict.setdefault(值,[])。append(键)
for k,v in dict.iteritems():
try:
reversed_dict[v].append(k)
except KeyError:
reversed_dict[v]=[k]
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)
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)