Слияние 2 списка словаря на основе конкретного ключа - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно объединить два списка словарей на основе определенных ключей, иначе нужно добавить

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

feed_mapping = {'BC': 11, 'HA':12, 'AB':16,'GR':18}
L = ["AB-24519152","BC-24519152"]

years_dict = dict()
l1 = []
for line in L:
    feed_id = feed_mapping[line.split('-')[0]]
    if feed_id in years_dict:
        # append the new number to the existing array at this slot
        years_dict[feed_id].append(line)
    else:
        # create a new array in this slot
        years_dict[feed_id] = [line]


for element,values in years_dict.items():
    l1.append({"id":values,"feed":element})


print(l1)


l1=  [{'id': ['AB-23473427','AB-99999'], 'feed': 16}, {'id': ['HA-4848231'], 'feed': 12}]
l2 = [{'id': ['AB-23473427'], 'feed': 14}, {'id': ['HA-4848231'], 'feed': 12}]

Ожидаемый результат:

[{'id': ['AB-23473427','AB-99999'], 'feed': 16}, {'id': ['HA-4848231','HA-4848231'], 'feed': 12},{'id': ['AB-23473427'], 'feed': 14}]

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Вы должны использовать структуру данных, которая лучше подходила для этой задачи, которая по сути является вашей собственной years_dict.

from collections import defaultdict
l1=  [{'id': ['AB-23473427','AB-99999'], 'feed': 16}, {'id': ['HA-4848231'], 'feed': 12}]
l2 = [{'id': ['AB-23473427'], 'feed': 14}, {'id': ['HA-4848231'], 'feed': 12}]

temp = defaultdict(list) 

for i in l1:
    temp[i['feed']].extend(i['id'])

for i in l2:
    temp[i['feed']].extend(i['id'])

#Notice that temp is essentially same as years_dict, but with information of both lists
result = [{"id":v,"feed":k} for k,v in temp.items()]
#Output:
[{'id': ['AB-23473427', 'AB-99999'], 'feed': 16},
 {'id': ['HA-4848231', 'HA-4848231'], 'feed': 12},
 {'id': ['AB-23473427'], 'feed': 14}]

Итак, пока этот код работает, я рекомендую вместо этого сохранять ваш years_dict для всех списков и только преобразовывать его в окончательный вывод в конце.

1 голос
/ 28 марта 2019
l1=  [{'id': ['AB-23473427','AB-99999'], 'feed': 16}, {'id': ['HA-4848231'], 'feed': 12}]
l2 = [{'id': ['AB-23473427'], 'feed': 14}, {'id': ['HA-4848231'], 'feed': 12}]

for elm2 in l2:
    for elm1 in l1:
        if elm2['feed'] == elm1['feed']:
            elm1['id'].extend(elm2['id'])
            break
    else:
        l1.append(elm2)

Попробуйте это.Это устанавливает l1 в [{'id': ['AB-23473427', 'AB-99999'], 'feed': 16}, {'id': ['HA-4848231', 'HA-4848231'], 'feed': 12}, {'id': ['AB-23473427'], 'feed': 14}]

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