Сопоставить и объединить 2 списка по условию

Мой скрипт выгружает из моей группы vk массив сообщений из темы с объявлениями в формате json с помощью vk api, чтобы удалять те, которые устарели по дате.

def vkresponse(topic, offset=1, count=100):
response = requests.get('https://api.vk.com/method/board.getComments',
                        params={
                            'access_token': token,
                            'v': version,
                            'group_id': domain,
                            'topic_id': topic,
                            'offset': offset,
                            'count': count,
                            'extended': 1
                        }
                        )
return response

data = vkresponse(topic).json()['response']['items']

Удаленные сообщения попадают в гугл таблицу, просто для логов. Появилось желание в одном из столбцов видеть имя автора объявления вместо vk id. Для этого добавил следующие строки:

data = vkresponse(topic)
data1 = data.json()['response']['items']
data2 = data.json()['response']['profiles']

data1 выглядит примерно так (убрал лишние ключи):

[{'id': 11111, 'from_id': 999999999, 'date': 1620713847, 'text': 'Объявление 1'}]

data2:

[{'first_name': 'Вася', 'id': 999999999, 'last_name': 'Пупкин', 'screen_name': 'id999999999'}]

Сначала сделал так:

for i in range(len(data1)):
    out.append({**data1[i], **data2[i]})

Но оказалось, что длина data1 не совпадает с data2, т.к. data2 содержит только уникальные id пользователей, если кто-то разместил больше одного сообщения, то в data2 он будет упоминаться только один раз. А также ключ id в data1 - это id сообщения, а в data2 - id пользователя. Необходимо, чтобы скрипт сопоставлял from_id из data1 с id из data2, чтобы в результате получилось это:

[{'id': 11111, 'from_id': 999999999, 'date': 1620713847, 'text': 'Объявление 1', 'first_name': 'Вася', 'last_name': 'Пупкин', 'screen_name': 'id999999999'}, {'id': 22222, 'from_id': 888888888, 'date': 1621321639, 'text': 'Объявление 2', 'first_name': 'Иван', 'last_name': 'Иванов', 'screen_name': 'id888888888'}]

Буду рад любой помощи или подсказкам, ибо в Python совсем новичок


Ответы (1 шт):

Автор решения: cj111

В общем, может и не очень изящно, но решил эту задачу так: заменил ключ id в data2 на from_id, как в data1. И сравнивая массивы по этому ключу, объединил строки.

for i in range(len(data2)):
    data2[i]['from_id'] = data2[i].pop('id')

for i in range(len(data1)):
    for j in range(len(data2)):
        if data2[j]['from_id'] == data1[i]['from_id']:
            out.append({**data1[i], **data2[j]})
→ Ссылка