22
Июл
2021

Слияние данных из 2-х списков со словарями по одинаковому ключу и его значению

Из разных сервисов получаю 2 списка с пользовательскими данными в виде словарей, в обоих списках в словарях есть одинаковый ключ 'user_id', количество записей в списках может не совпадать, в списке 'current_list' (данные об активных пользователях из ldap) записей о пользователях будет всегда либо меньше либо равное количеству в списке 'users_list':

users_list = [
    {'user_id': '24638', 'phone_name': 'p24638', "some_key": "some_value", ...},
    ...,
    {'user_id': '03283', 'phone_name': 'p03283', "some_key": "some_value", ...},
    {'user_id': '01595', 'phone_name': 'p01595', "some_key": "some_value", ...}
]

current_list = [
    {'user_id': '03283', 'display_name': 'Z.Oleg', 'mail': '[email protected]', ...},
    ...,
    {'user_id': '01595', 'display_name': 'S.Mikhail', 'mail': '[email protected]', ...}
]

Необходимо дополнить данные пользователя в списке 'current_list' данными из первого списка при совпадении значений ключа 'user_id'. Самое простое решение: пройтись 2 циклами по спискам и обновить данные:

for i in current_list:
    for j in users_list:
        if i["user_id"] == j["user_id"]:
            i.update(
                {
                    "phone_name": j["phone_name"],
                    "some_key"  : j["some_value"] 
                }
            )

но тогда суммарное количество иттераций будет i*j, а списки могут быть большими и каждый содержать по несколько десятков тысяч записей. Какие еще могут быть варианты смерджить данные, желательно без использования сторонних библиотек?

Источник: https://ru.stackoverflow.com/questions/1307754/%D0%A1%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B8%D0%B7-2-%D1%85-%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%B2-%D1%81%D0%BE-%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D1%8F%D0%BC%D0%B8-%D0%BF%D0%BE-%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2%D0%BE%D0%BC%D1%83-%D0%BA%D0%BB%D1%8E%D1%87%D1%83-%D0%B8-%D0%B5%D0%B3%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8E

Тебе может это понравится...

Добавить комментарий