我有以下两个词典:
d1 = {'1':['a','b','c'],'2':['a','b','c','e'],'4':['a','f','c']}
d2 = {'1':['nm','nm','st'],'2':['nm','nm','nm','nm'],'4':['st','nm','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','b','c','e']],'4':[['f'],['c'],['a']]}
有什么办法可以到达那里吗?我不知道如何到达那里,我知道groupby()
,但是我无法正确使用它-甚至不确定它是否可以在这里使用。
答案 0 :(得分:2)
使用itertools.groupby
例如:
from itertools import groupby
d1 = {'1':['a','b','c'],'2':['a','b','c','e'],'4':['a','f','c']}
d2 = {'1':['nm','nm','st'],'2':['nm','nm','nm','nm'],'4':['st','nm','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', 'b', 'c', 'e']],
'4': [['a'], ['f'], ['c']]}
答案 1 :(得分:0)
与上面类似的解决方案略有不同。还使用group by和zip来获取输出。
from itertools import groupby
d1 = {'1':['a','b','c'],'2':['a','b','c','e'],'4':['a','f','c']}
d2 = {'1':['nm','nm','st'],'2':['nm','nm','nm','nm'],'4':['st','nm','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', 'b'], ['c']], '2': [['a', 'b', 'c', 'e']], '4': [['a'], ['f'], ['c']]}