Как сравнить два списка значения и добавить это значение в новый список? - PullRequest
0 голосов
/ 12 сентября 2018
list1 = [{'name': 'Tyler', 'age': '12', 'city': 'SF'}, {'name': 'Caitlyn', 'age': '10', 'city': 'SJ'}]
list2 = [{'age': '12', 'hobby': 'soccer', 'song': 'Abba'}, {'age': '10', 'hobby': 'baseball', 'song': 'Punk'}]

Вот два списка, и я хочу сравнить age в каждом соответствующем списке и добавить его в список1. Ребята, можете ли вы помочь мне с этим?

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

list1 = [{'name': 'Tyler', 'age': '12', 'city': 'SF', 'age': '12', 'hobby': 'soccer', 'song': 'Abba'}, {'name': 'Caitlyn', 'age': '10', 'city': 'SJ', 'age': '10', 'hobby': 'baseball', 'song': 'Punk'}]

Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Python 2 Операция выглядит следующим образом

for d in list1:
    for e in list2:
        if d['age'] == e['age']:
            d.update(e)

Python 3 Вы можете написать в одну строку как

[{**d, **e} if d['age'] == e['age'] else d for d in list1 for e in list2]
0 голосов
/ 12 сентября 2018

Вы можете манипулировать списками словарей, но для практических целей это не самая эффективная или адаптируемая структура для того, что вы хотите сделать.

Если вы счастливы использовать стороннюю библиотеку, вы можете использовать Pandas и pd.DataFrame.merge:

import pandas as pd

res = pd.DataFrame(list1).merge(pd.DataFrame(list2))

Затем вы можете вывести либо фрейм данных, либо список словарей:

print(res)

  age city     name     hobby  song
0  12   SF    Tyler    soccer  Abba
1  10   SJ  Caitlyn  baseball  Punk

print(res.to_dict('records'))

[{'age': '12', 'city': 'SF', 'name': 'Tyler', 'hobby': 'soccer', 'song': 'Abba'}, 
 {'age': '10', 'city': 'SJ', 'name': 'Caitlyn', 'hobby': 'baseball', 'song': 'Punk'}]
0 голосов
/ 12 сентября 2018

Если я правильно понимаю, вы хотите объединить каждый словарь в list2 в словарь в list1 с тем же значением в ключе age.

Попробуйте что-то вроде

def join_by_age(list1, list2):
    for item1 in list1:
        for item2 in list2:
            if item1['age'] == item2['age']:
                item1.update(item2)
                break
    return list1

# Join the two lists.
print(join_by_age(list1, list2))

Имейте в виду, что словари в list1 будут изменены и что если несколько словарей в list2 имеют одинаковый age, будет использоваться только первый.

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