我有一本字典:
dict = {'A':[1,2,5],'B':[3,6,13],'C':[2,3,6],'D':[4,6,8]}
我想将所有的公共元素作为键提取到一个新的字典中,其对应的值作为从中提取它们的dict
中的键。我想要的是:
newdict = {1:['A'],2:['A','C'],3:['B','C'],4:['D'],5:['A'],6:['B','C','D'],8:['D'],13:['B']}
.
我试图通过复制字典dict
来比较每个元素的值,并比较每个元素(dict1
是dict
的副本):
for i, j in zip(range(len(dict)), range(len(dict1))):
for m, n in zip(range(len(dict[i])), range(len(dict1[j]))):
if dict[i][m] == dict1[j][n]:
print(dict[i][m])
for i in range(len(dict)):
for k in range(len(dict[i])):
#print(dict[i][k])
for j in range(dict[i+1][k], len(g)):
#print(j)
if dict[i][k] == dict[i+1][j]:
print(dict[i][k])
但是,我最终得到了索引超出范围错误,或者甚至在能够提取常见重复值之前无法获得适当的键。有人知道怎么做吗?
使用defaultdict
(减少臃肿的代码)的简单解决方案
from collections import defaultdict
d2 = defaultdict(list)
for k,v in d.items():
for number in v:
d2[number].append(k)
>>> print(d2)
defaultdict(list,
{1: ['A'],
2: ['A', 'C'],
3: ['B', 'C'],
4: ['D'],
5: ['A'],
6: ['B', 'C', 'D'],
8: ['D'],
13: ['B']})
你也可以使用普通的字典,只是要添加一些检查:
d2 = {}
for k,v in d.items():
for number in v:
if number in d2:
d2[number].append(k)
else:
d2[number] = [k]
最后,避免将字典命名为dict
,因为它会覆盖内置的dict
名称。