Получение списка со словарем в python

есть два списка со словарями :

dict_groups = [{'name': 'Новые Альбомы', 'gid': 4100014},
{'name': 'Synthpop [Futurepop, Retrowave, Electropop]', 'gid': 8564},
{'name': 'E:\\music\\leftfield', 'gid': 101522128},
{'name': 'Бренд одежды | MEDICINE', 'gid': 134709480},
{'name': 'Другая Музыка', 'gid': 35486626},
{'name': 'E:\\music\\trip-hop', 'gid': 27683540},
{'name': 'Depeche Mode', 'gid': 125927592}]


x = [{'gid': 35486626},{'gid': 134709480},{'gid': 27683540}]

Как видно, в обоих списках присутствуют одинаковые значения. Так вот, каким образом можно сравнить эти два списка так, что бы вернуть список с данными из списка х, но дополненными ключ-значение name из другого списка. т.е. в итоге я должен получить список формата:

список= [{'name': 'Другая Музыка', 'gid': 35486626},
{'name': 'E:\\music\\trip-hop', 'gid': 27683540},
{'name': 'Бренд одежды | MEDICINE', 'gid': 134709480}]

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

Автор решения: вася
dict_groups = [{'name': 'Новые Альбомы', 'gid': 4100014},
{'name': 'Synthpop [Futurepop, Retrowave, Electropop]', 'gid': 8564},
{'name': 'E:\\music\\leftfield', 'gid': 101522128},
{'name': 'Бренд одежды | MEDICINE', 'gid': 134709480},
{'name': 'Другая Музыка', 'gid': 35486626},
{'name': 'E:\\music\\trip-hop', 'gid': 27683540},
{'name': 'Depeche Mode', 'gid': 125927592}]

x = [{'gid': 35486626},{'gid': 134709480},{'gid': 27683540}]

x_gids = [x_dict['gid'] for x_dict in x]
gid_names = {dict_group['gid'] : dict_group['name'] for dict_group in dict_groups}

result_dicts = [{'name': gid_names[x_gid], 'gid': x_gid} for x_gid in x_gids]

print(result_dicts)
→ Ссылка
Автор решения: Pavel Durmanov
In [5]: [dict_group for gid in x for dict_group in dict_groups if dict_group["gid"] == gid["gid"]]
Out[5]:
[{'name': 'Другая Музыка', 'gid': 35486626},
 {'name': 'Бренд одежды | MEDICINE', 'gid': 134709480},
 {'name': 'E:\\music\\trip-hop', 'gid': 27683540}]
→ Ссылка
Автор решения: Vasyl Kolomiets

Дополню своим решением. Предварительно замерим производительность предложенного выше красивого варианта от @Pavel:

%timeit [dict_group for gid in x for dict_group in dict_groups if dict_group["gid"] == gid["gid"]]
8.65 µs ± 1.57 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Мой вариант использует скорость встроенного оператора in. Правда предварительно надо извлечь значения ключей 'gid' из списка.
Итак

 x_val = [d["gid"] for d in x]
 rez = [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]

и проведем замеры:

%timeit x_val = [d["gid"] for d in x]
725 ns ± 58.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
%timeit [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]
2.5 µs ± 212 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Итого - чуток быстрее и немного понятнее. А читабельность - считается ).
Кроме того, можно рассмотреть вариант с перемещением списка значений ключа 'gid' из списка x не в конструкцию "список", а в конструкцию "кортеж". Разница в коде - не квадратные скобки, а круглые.

 x_val = tuple(d["gid"] for d in x)
 rez = [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]

Оценим изменение в производительности:

%timeit x_val = tuple(d["gid"] for d in x)
1.55 µs ± 81.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
%timeit [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]
2.19 µs ± 93.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Итоговый вариант получается в два раза быстрее красивого "лобового решения". Можно ли записать итоговый вариант в виде "однострочника"? Конечно можно:

%timeit [dict_el for dict_el in dict_groups if dict_el["gid"] in tuple(d["gid"] for d in x)]
11.9 µs ± 756 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each))

Не знаю уж почему, но однострочник оказывается медленнее. Так что рекомендации учебников везде использовать "компрехенсив" - надо проверять. ;-)

Ну и вариант - чемпион. Компрехенсив множество!

x_val = {d["gid"] for d in x}
rez = [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]

с таймингом:

%timeit x_val = {d["gid"] for d in x}
731 ns ± 52.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]
1.62 µs ± 120 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
→ Ссылка
Автор решения: Сhurina Margaery
x = [{'gid': 35486626},{'gid': 134709480},{'gid': 27683540}]
new = [elem['gid'] for elem in x]

res = [elem for elem in dict_groups if elem['gid'] in new]
print(res)
→ Ссылка