Объединить список словаря на основе значений ключа - PullRequest
0 голосов
/ 21 мая 2019

У меня есть два списка словарей, где я должен объединить два списка на основе значения ключа.

a = [{'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_1', 'mac': 'e200383d1149a4c975a59618', 'rssi': -63.116279069767444}, {'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_1', 'mac': 'e200383d1149a90975a59629', 'rssi': -61.5}, {'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_2', 'mac': 'e200383d1149a90975a59629', 'rssi': -59.086021505376344}]

b = [{'mac': 'e200383d1149a4c975a59618', 'status': 'location_recording'}, {'mac': 'e200383d1149a90975a59629', 'status': 'location_environment'}]


expected output = [
{'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_1', 'mac': 'e200383d1149a4c975a59618', 'rssi': -63.116279069767444, 'status': 'location_recording'}}, 
{'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_1', 'mac': 'e200383d1149a90975a59629', 'rssi': -61.5, 'status': 'location_environment'}, 
{'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_2', 'mac': 'e200383d1149a90975a59629', 'rssi': -59.086021505376344, 'status': 'location_environment'}]

Может ли кто-нибудь помочь мне с ожидаемым результатом?

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Один из подходов заключается в использовании зацикливания dict.

Ex:

a = [{'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_1', 'mac': 'e200383d1149a4c975a59618', 'rssi': -63.116279069767444}, {'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_1', 'mac': 'e200383d1149a90975a59629', 'rssi': -61.5}, {'site': 'KRM Plaza South Tower', 'building': 'd-block', 'level': 'reception', 'gw_mac': 'b827eb36fb0b_2', 'mac': 'e200383d1149a90975a59629', 'rssi': -59.086021505376344}]
b = [{'mac': 'e200383d1149a4c975a59618', 'status': 'location_recording'}, {'mac': 'e200383d1149a90975a59629', 'status': 'location_environment'}]

b = {i['mac']: i["status"] for i in b}  #loopup dict

for i in a:
    if i["mac"] in b:
        i.update({"status": b[i["mac"]]})
print(a)

Выход:

[{'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_1',
  'level': 'reception',
  'mac': 'e200383d1149a4c975a59618',
  'rssi': -63.116279069767444,
  'site': 'KRM Plaza South Tower',
  'status': 'location_recording'},
 {'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_1',
  'level': 'reception',
  'mac': 'e200383d1149a90975a59629',
  'rssi': -61.5,
  'site': 'KRM Plaza South Tower',
  'status': 'location_environment'},
 {'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_2',
  'level': 'reception',
  'mac': 'e200383d1149a90975a59629',
  'rssi': -59.086021505376344,
  'site': 'KRM Plaza South Tower',
  'status': 'location_environment'}]
1 голос
/ 21 мая 2019

Вы можете использовать простой вложенный цикл следующим образом:

for item in b:
    for site in a:
        if site.get('mac') == item.get('mac'):
            site.update({'status':item.get('status')})

Выход

[{'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_1',
  'level': 'reception',
  'mac': 'e200383d1149a4c975a59618',
  'rssi': -63.116279069767444,
  'site': 'KRM Plaza South Tower',
  'status': 'location_recording'},
 {'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_1',
  'level': 'reception',
  'mac': 'e200383d1149a90975a59629',
  'rssi': -61.5,
  'site': 'KRM Plaza South Tower',
  'status': 'location_environment'},
 {'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_2',
  'level': 'reception',
  'mac': 'e200383d1149a90975a59629',
  'rssi': -59.086021505376344,
  'site': 'KRM Plaza South Tower',
  'status': 'location_environment'}]
1 голос
/ 21 мая 2019

Вы можете перебирать оба списка и объединять их, если совпадает ключ "mac".

Вот однострочное решение с использованием понимания списка (если списки похожи на a & b в вопросе)

In [6]: [{**a_val, **b_val} for a_val in a for b_val in b if b_val["mac"] == a_val["mac"]]
Out[6]:
[{'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_1',
  'level': 'reception',
  'mac': 'e200383d1149a4c975a59618',
  'rssi': -63.116279069767444,
  'site': 'KRM Plaza South Tower',
  'status': 'location_recording'},
 {'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_1',
  'level': 'reception',
  'mac': 'e200383d1149a90975a59629',
  'rssi': -61.5,
  'site': 'KRM Plaza South Tower',
  'status': 'location_environment'},
 {'building': 'd-block',
  'gw_mac': 'b827eb36fb0b_2',
  'level': 'reception',
  'mac': 'e200383d1149a90975a59629',
  'rssi': -59.086021505376344,
  'site': 'KRM Plaza South Tower',
  'status': 'location_environment'}]

ПРИМЕЧАНИЕ. Вы можете выполнить слияние словаря, используя ** выше Python 3.5, или использовать функцию копирования и обновления словаря для версий ниже него.

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