список операций в python для объединения - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть сценарий, в котором у меня есть два списка l1 и l2, как указано ниже:

l1 = [{'app_id': 9833, 'state': 0}, {'app_id': 1036, 'state': 1}, {'app_id': 1039, 'state': 0},{'app_id': 1030, 'state': 0}]

l2 = [{'app_id': 9833, 'name': ABC}, {'app_id': 1036, 'name': CDE}, {'app_id': 1039, 'name': XYZ},{'app_id': 1030, 'name': JKL}]

Я пытаюсь проверить в этих двух списках, является ли app_id общим в обоих списках, если оно общее затем добавьте значение name в третий список, чтобы желаемый результат был примерно таким:

l3 = [{'app_id': 9833, 'name': ABC, 'state': 0}, {'app_id': 1036, 'name': CDE, 'state': 1}, {'app_id': 1039, 'name': XYZ, 'state': 0},{'app_id': 1030, 'name': JKL, 'state': 0}]

Это то, что я пробовал, и похоже, что подход неправильный.

for key in l1:
    temp=key['app_id']
    for keynd in l2:
        if keynd[app_id]==temp:
            l3.append(keynd['name'])

Может ли кто-нибудь помочь мне здесь, как этого добиться?

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Ваш вопрос в настоящее время неоднозначен:

  • что делать с элементами l1, отсутствующими в l2? Я буду предполагать игнорировать их
  • , что делать с элементами l2, отсутствующими в l1? Я буду предполагать игнорировать их
  • что делать, если app_id из l1 присутствует более чем один раз в l2? Я буду предполагать использование любого и буду использовать последний

Поиск дикта, как правило, быстрее, чем итерация списка, поэтому я построю вспомогательное отображение app_id => name из l2 и построю копия l1, содержащая только app_id, присутствующая в l2, и затем добавление имени из вспомогательного сопоставления:

aux = {it['app_id']: it['name'] for it in l2}
l3 = [it.copy() for it in l1 if it['app_id'] in aux]
for it in l3:
    it['name'] = aux[it['app_id']]

, которое оно дает для l3: [{'app_id': 9833, 'state': 0, 'name': 'ABC'}, {'app_id': 1036, 'state': 1, 'name': 'CDE'}, {'app_id': 1039, 'state': 0, 'name': 'XYZ'}, {'app_id': 1030, 'state': 0, 'name': 'JKL'}] без необходимости во вложенных циклах.

0 голосов
/ 20 февраля 2020

Альтернативное решение: объединение их с использованием фрейма данных:

import pandas as pd
l1 = [{'app_id': 9833, 'state': 0}, {'app_id': 1036, 'state': 1}, {'app_id': 1039, 'state': 0},{'app_id': 1030, 'state': 0}]
l2 = [{'app_id': 9833, 'name': 'ABC'}, {'app_id': 1036, 'name': 'CDE'}, {'app_id': 1039, 'name': 'XYZ'},{'app_id': 1030, 'name': 'JKL'}]
L1 = pd.DataFrame(l1)
L2 = pd.DataFrame(l2)
print(pd.merge(L1, L2, on = 'app_id').to_dict(orient = 'records'))

вывод:

[{'app_id': 9833, 'name': 'ABC', 'state': 0},
 {'app_id': 1036, 'name': 'CDE', 'state': 1},
 {'app_id': 1039, 'name': 'XYZ', 'state': 0},
 {'app_id': 1030, 'name': 'JKL', 'state': 0}]
0 голосов
/ 20 февраля 2020

Я предположил, что имена также являются строками. Это должно работать:

l1 = [{'app_id': 9833, 'state': 0}, {'app_id': 1036, 'state': 1}, {'app_id': 1039, 'state': 0},{'app_id': 1030, 'state': 0}]
l2 = [{'app_id': 9833, 'name': 'ABC'}, {'app_id': 1036, 'name': 'CDE'}, {'app_id': 1039, 'name': 'XYZ'}, {'app_id': 1030, 'name': 'JKL'}]
l3 = []

for i in range(len(l1)):
    if l1[i]['app_id'] == l2[i]['app_id']:
        l3.append({'app_id': l1[i]['app_id'], 'name': l2[i]['name'], 'state': l1[i]['state']})

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