#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']]}