объединить два python списка dict с индексом - PullRequest
0 голосов
/ 20 июня 2020

Я хочу объединить два списка во вложенную конструкцию.

List_A: [{'id':1,'val':'abc'},{'id':2,'val':'bcd'},{'id':3,'val':'efg'}]
List_B: [{'ref':1,'name':'xyz'},{'ref':2,'name':'opq'},{'ref:2,'name':'jkl'},{'ref':3,'name':'nmo'}]

Результат должен быть:

List_ C: [{'id':1,'list_b':[{'name':'xyz'}]},{'id':2,'list_b':[{'name':'opq'},{'name':'jkl'}]},{'id':3,'list_b':[{'name':'nmo'}]}]

Я пробовал pandas объединить и объединить, но результата не было. Конечно, я мог бы перебирать список и делать это ключ за ключом, но могло бы быть гораздо лучшее решение.

Ответы [ 2 ]

0 голосов
/ 20 июня 2020
from copy import deepcopy
List_C = deepcopy(List_A)
for dct1 in List_C:
    dct1.pop('val')
    dct1['list_b'] = list()
    for dct2 in List_B:
        if dct1['id'] == dct2['ref']:
            dct3 = dct2.copy()
            dct3.pop('ref')
            dct1['list_b'].append(dct3)
0 голосов
/ 20 июня 2020

Исходя из желаемого результата, вам вообще не нужен List_A.

from collections import defaultdict

b = [{'ref':1,'name':'xyz'}, {'ref':2,'name':'opq'}, {'ref':2,'name':'jkl'},{'ref':3,'name':'nmo'}]
dct = {}
[dct.setdefault(tuple(i), list()).append(j) for *i, j in [tuple(x.values()) for x in b]]
[{'id':k[0], 'list_b':list({'name': n} for n in v)} for k, v in dct.items()]

Вывод:

[{'id': 1, 'list_b': [{'name': 'xyz'}]},
 {'id': 2, 'list_b': [{'name': 'opq'}, {'name': 'jkl'}]},
 {'id': 3, 'list_b': [{'name': 'nmo'}]}]

В целом это кажется слишком сложным способом хранения data, но если вам нужен этот формат c (например, для ввода в другую программу), тогда w / e.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...