Как объединить в список два вложенных в список словаря?
у меня есть два списка словарей, которые я хочу объеденить на манер 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 шт):
Автор решения: CrazyElf
→ Ссылка
Что не так в вашем коде и что нужно сделать:
- Почему вы решили, что на выходе будет именно словарь? В общем случае, если не заданы ограничений в виде уникальных индексов, результирующая выборка - это такой же список словарей, как и входящие списки словарей, это не словарь словарей, как у вас.
- Суть
LEFT JOINв том, что все строки левой таблицы (т.е. все словари из первого списка) попадают в выходной список как минимум один раз. А строки правой таблицы попадают если получилось их соотнести со строками левой таблицы по заданному условию. Причём, если из правой таблицы найдётся несколько соответствий строке левой таблице, то в выходной таблице получится больше строк, чем было в левой таблице. - В общем, вам нужно сделать цикл по первому списку и правильно обработать случаи:
- Когда не найдено соответствий в правом списке, тогда в выходной список попадут только значения словаря из первого списка, а от второго списка туда должны попасть только ключи словарей правой таблицы со значениями
None. - Когда же найдено одно или более соответствий по условию, то на выход должны попасть объединённые словари из ключей и значений элемента левого списка и элемента правого списка, которые так сопоставились.
- Когда не найдено соответствий в правом списке, тогда в выходной список попадут только значения словаря из первого списка, а от второго списка туда должны попасть только ключи словарей правой таблицы со значениями
Вот это всё вам нужно правильно запрограммировать. Ничего сложного тут нет, нужно просто сесть и подумать. Написать циклы. И некоторые ещё проверки и условные действия.