Как объединить в список два вложенных в список словаря?

Рейтинг: -1Ответов: 1Опубликовано: 22.01.2023

у меня есть два списка словарей, которые я хочу объеденить на манер SQL запроса

transactions = [
    {'dt': '2020-03-23', 'id': 'alyx', 'price': 1.0},
    {'dt': '1725-28-01', 'id': 'superpetr', 'price': 99.9},
    {'dt': '2019-11-23', 'id': 'alyx', 'price': 2.0},
    {'dt': '2013-12-02', 'id': 'morty', 'price': 13.5},
]

users = [
    {'id': 'superpetr', 'name': 'Пётр Первый', 'gender': 'male', 'age': 52},
    {'id': 'alyx', 'name': 'Аликс Вэнс', 'gender': 'female', 'age': 22},
]

# Напишите код на python, который реализует следующий запрос SQL:
# SELECT t.dt, u.name, t.price
# FROM
#     transactions AS t
#     LEFT JOIN
#     users AS u USING(id) 

Я пробовал несколько алгоритмов, но не один не дал результат. Извините, я плохо разбираюсь в словарях, тем более в словарях в списках. Из последнего я пробовал метод defaultdict, но меня получилось не Left Joint. Да и на собеседовании, говорили что можно через функцию все реализовать.

from collections import defaultdict

d = defaultdict(dict)
for l in (t, u):
    for elem in l:
        d[elem['id']].update(elem)
l3 = d.values()

for i in l3:
    print(i['dt'],i['name'],i['price'])

ну и конечно если значение отсутствует будет ошибка

Ответы

▲ 1

Что не так в вашем коде и что нужно сделать:

  • Почему вы решили, что на выходе будет именно словарь? В общем случае, если не заданы ограничений в виде уникальных индексов, результирующая выборка - это такой же список словарей, как и входящие списки словарей, это не словарь словарей, как у вас.
  • Суть LEFT JOIN в том, что все строки левой таблицы (т.е. все словари из первого списка) попадают в выходной список как минимум один раз. А строки правой таблицы попадают если получилось их соотнести со строками левой таблицы по заданному условию. Причём, если из правой таблицы найдётся несколько соответствий строке левой таблице, то в выходной таблице получится больше строк, чем было в левой таблице.
  • В общем, вам нужно сделать цикл по первому списку и правильно обработать случаи:
    • Когда не найдено соответствий в правом списке, тогда в выходной список попадут только значения словаря из первого списка, а от второго списка туда должны попасть только ключи словарей правой таблицы со значениями None.
    • Когда же найдено одно или более соответствий по условию, то на выход должны попасть объединённые словари из ключей и значений элемента левого списка и элемента правого списка, которые так сопоставились.

Вот это всё вам нужно правильно запрограммировать. Ничего сложного тут нет, нужно просто сесть и подумать. Написать циклы. И некоторые ещё проверки и условные действия.