Преобразование списка списков в список словарей
Есть табличные данные в виде списка со структурой:
raw_data= [
['id', '1', '2', '3'],
['email', '[email protected]', '[email protected]','[email protected]'],
]
т.е. это таблица в виде списка списков, где raw_data[n] это столбец (столбцов много, 62), а raw_data[n][0] название столбца. Нужно преобразовать это в список словарей:
data= [
{'id': '1', 'email': '[email protected]'},
{'id': '2', 'email': '[email protected]'},
{'id': '3', 'email': '[email protected]'},
]
Ясно, что это можно делать через вложенные циклы, т.е. для каждого raw_data[n][i] брать i элемент и добавлять в словарь.
Возможно есть какое-то более элегантное/pythonic решение?
Ответы (3 шт):
Автор решения: Namerek
→ Ссылка
При условии что количество элементов в каждом из дочерних списков одинаковое:
from typing import List, Tuple
from pprint import pp
raw_data = [
['id', '1', '2', '3'],
['email', '[email protected]', '[email protected]', '[email protected]'],
['phone', '+000000000000', '+1111111111111', '+33333333333333']
]
def to_items(elements: list) -> List[Tuple]:
key, *values = elements
return [
(key, value,)
for value in values
]
p = [dict(elem) for elem in
zip(*map(
to_items, raw_data
))
]
pp(p)
Output
[{'id': 1, 'email': '[email protected]', 'phone': '+000000000000'},
{'id': 2, 'email': '[email protected]', 'phone': '+1111111111111'},
{'id': 3, 'email': '[email protected]', 'phone': '+33333333333333'}]
Автор решения: gil9red
→ Ссылка
Ключи заранее найдем, а значения в ходе перебора стобцов:
raw_data = [
['id', '1', '2', '3'],
['email', '[email protected]', '[email protected]', '[email protected]'],
['phone', '+000000000000', '+1111111111111', '+33333333333333']
]
keys = [x[0] for x in raw_data]
for j in range(1, len(raw_data[0])):
values = [row[j] for row in raw_data]
print(dict(zip(keys, values)))
Результат:
{'id': '1', 'email': '[email protected]', 'phone': '+000000000000'}
{'id': '2', 'email': '[email protected]', 'phone': '+1111111111111'}
{'id': '3', 'email': '[email protected]', 'phone': '+33333333333333'}
PS.
Если еще сразу в виде списка получать:
data = [
dict(zip(keys, [row[j] for row in raw_data]))
for j in range(1, len(raw_data[0]))
]
Автор решения: Danis
→ Ссылка
raw_data = [
['id', '1', '2', '3'],
['email', '[email protected]', '[email protected]', '[email protected]'],
['phone', '+000000000000', '+1111111111111', '+33333333333333']
]
raw_data = zip(*raw_data)
keys = next(raw_data)
for values in raw_data:
print(dict(zip(keys, values)))