Python 如何反转字典项和按公共值分组的列表键

Python 如何反转字典项和按公共值分组的列表键,python,list,dictionary,Python,List,Dictionary,我有一个字典,我想按公共值分组: init_dict = {'00001': 'string1', '00002': 'string2', '00003': 'string1', '00004': 'string3', '00005': 'string2'} 我想创建一个新字典,对值进行分组,并按如下方式列出键: new_dict = {'string1': ['00001', '00003'], 'string2':['00002', '00004'], 'string3': ['00004

我有一个字典,我想按公共值分组:

init_dict = {'00001': 'string1', '00002': 'string2', '00003': 'string1', '00004': 'string3', '00005': 'string2'}
我想创建一个新字典,对值进行分组,并按如下方式列出键:

new_dict = {'string1': ['00001', '00003'], 'string2':['00002', '00004'], 'string3': ['00004']}
我尝试了很多东西,这是我能得到的最接近的

lookup = 'string1'
all_keys = []
for k, v in init_dict.items():
  if v == lookup:
    all_keys.append(k)
print(all_keys)
这就产生了第一个列表:
['00001','00003']
,所以我想我可以通过某种方式循环一个
查找值列表,但是不能,因为我正在处理字符串。有没有一种方法可以做到这一点,有没有一种相对有效的方法,因为我最初的字典中有53000个条目。非常感谢您的帮助,因为我已经尝试了几个小时不同的事情。

使用a,指定一个
列表作为默认参数,并从字典中附加相应的值:

from collections import defaultdict

d =  defaultdict(list)
for k,v in init_dict.items():
    d[v].append(k)


您可以使用
defaultdict

result = defaultdict(list)
for k, v in init_dict.items():
    result[v].append(k)
itertools.groupby

result = {k: [x[0] for x in v] for k, v in
          groupby(sorted(init_dict.items(), key=lambda kv: kv[1]), key=lambda kv: kv[1])}

您也可以使用普通的
dict
(而不是
defaultdict
):

new_dict={}
对于键,init_dict.items()中的val:
如果val在新目录中:
新建目录[val]。追加(键)
其他:
新记录[val]=[]
新建目录[val]。追加(键)
输出:

new_dict={'string1':['00001','00003'],
'字符串2':['00002','00005'],
'字符串3':['00004']}
result = {k: [x[0] for x in v] for k, v in
          groupby(sorted(init_dict.items(), key=lambda kv: kv[1]), key=lambda kv: kv[1])}