如何根据另一个字典的值列表拆分字典的值列表?

问题描述

我有以下两个词典:

d1 = {'1':['a','b','c'],'2':['a','c','e'],'4':['a','f','c']}
d2 = {'1':['nm','nm','st'],'2':['nm','nm'],'4':['st','da']}

具有相同索引,相同键的值的每个元素都是“一起”。例如,对于键1,d1中的'a'连接到d2中的'nm','b'连接到'nm',而'c'连接到'st'。

我正在尝试根据d2中的值列表拆分d1中的值列表。在我的最终决定中,我将拥有:

{key:[[all values from d1 where d2='nm'],[all values from d1 where d2='da'],[all values from d1 where d2='st']]}

在这里,我想要的结果是上面的d1,d2示例,理想情况下会出现空列表:

res = {'1':[['a','b'],['c']],'2':[['a','e']],'4':[['f'],['c'],['a']]}

有什么办法可以到达那里吗?我不知道如何到达那里,我知道groupby(),但是我无法正确使用它-甚至不确定它是否可以在这里使用。

解决方法

使用itertools.groupby

例如:

from itertools import groupby

d1 = {'1':['a','b','c'],'2':['a','c','e'],'4':['a','f','c']}
d2 = {'1':['nm','nm','st'],'2':['nm','nm'],'4':['st','da']}

result = {}
for k,v in d1.items():
    for m,n in groupby(zip(v,d2[k]),lambda x: x[1]):
        result.setdefault(k,[]).append([s for s,_ in n])
print(result)

或者仅使用dict.setdefault

result = {}
for k,v in d1.items():
    temp = {}
    for m,n in zip(v,d2[k]):
        temp.setdefault(n,[]).append(m)
    result[k] = list(temp.values())
print(result)

输出:

{'1': [['a','b'],['c']],'2': [['a','e']],'4': [['a'],['f'],['c']]}
,

与上面类似的解决方案略有不同。还使用group by和zip来获取输出。

from itertools import groupby
d1 = {'1':['a','da']}
d3 = {}

for key in d1:
    d3[key] = [[e[0] for e in group] for _,group in groupby(zip(d1[key],d2[key]),key=lambda x: x[1])]

print(d3)

输出:

{'1': [['a',['c']]}