Как разделить список значений dict в соответствии со списком значений из другого dict?

#python-3.x #list #dictionary #split

#python-3.x #Список #словарь #разделить

Вопрос:

У меня есть 2 приведенных ниже словаря:

 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 ‘a’ в d1 соединен с ‘nm’ в d2, ‘b’ соединен с ‘nm’, а ‘c’ соединен с ‘st’.

Я пытаюсь разделить список значений из d1 в соответствии со списком значений из d2. В моем окончательном dict я бы:

{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() но я не смог использовать его должным образом — даже не уверен, что это сработает здесь.

Ответ №1:

Используя 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']]}
  

Ответ №2:

Аналогичное решение, приведенное выше, только немного отличается. Также использует 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']]}