Распарсить словари в таблицу

К примеру, даны словари с данными:

pers1 = {"Surname": "Ivanov", "Child": 3, "Age": "18"}

pers2 = dict([("Surname", "Petrov"), ("Name", "Ivan"), ("Age", "56")])

pers3 = dict([("Surname", "Sidorov"), ("Child", 1), ("Name", "Sergey")])

Как эти данные перенести в таблицу, чтобы получилось так:

A B C D
pers1 pers2 pers3
Surname Ivanov Petrov Sidorov
Name Ivan Sergey
Age 18 56
Child 1 3

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

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

Например используя Pandas:

import pandas as pd

# Данные из словарей
pers1 = {"Surname": "Ivanov", "Child": 3, "Age": "18"}

pers2 = dict([("Surname", "Petrov"), ("Name", "Ivan"), ("Age", "56")])

pers3 = dict([("Surname", "Sidorov"), ("Child", 1), ("Name", "Sergey")])

# Получаем имена переменных из locals()
names = [name for name in locals() if name.startswith('pers')]

# Создаем список словарей
data = [locals()[name] for name in names]

# Создаем DataFrame
df = pd.DataFrame(data, index=names)

# Транспонируем DataFrame, чтобы ключи стали индексами строк
df = df.T

# Заполняем отсутствующие значения NaN
df.fillna('', inplace=True)

# Задаем нужный порядок строк
desired_order = ['Surname', 'Name', 'Age', 'Child']
df = df.reindex(desired_order)

# Выводим таблицу (Вы можете записать в data.xlsx)
print(df)

output:

(.venv) PS C:\KWORK> & c:/KWORK/.venv/Scripts/python.exe c:/KWORK/MyUserBot/ruSo.py  
          pers1   pers2    pers3
Surname   Ivanov  Petrov   Sidorov
Name              Ivan     Sergey
Age       18      56
Child     3.0              1.0
→ Ссылка
Автор решения: Oopss
from pyexcelerate import Workbook


pers1 = {"Name": "Ivanov", "Child": 3, "Age": "18"}
pers2 = dict([("Name", "Petrov"), ("Surname", "Ivan"), ("Age", "56")])
pers3 = dict([("Name", "Sidorov"), ("Child", 1), ("Surname", "Sergey")])

# Список словарей
data = [pers1, pers2, pers3]

# Создаем Workbook и Worksheet
wb = Workbook()
ws = wb.new_sheet("Лист1")

# Записываем заголовки
headers=["Name","Surname","Child","Age"]

## Здесь можно переписать все ключи-заголовки, но порядок не могу определить
# for dict_pers in data:
#     for dict_key in dict_pers:
#         headers.append(dict_key)
#headers = []
# headers = list(set(headers))
# print(headers)

#Первый столбик заголовки
for row, header in enumerate(headers, 1):
    ws.set_cell_value(row, 1, header)

# Записываем данные
for row, header in enumerate(headers, 1):
    for col, pers in enumerate(data, 2):
        ws.set_cell_value(row, col, pers.get(header, " "))

# Сохраняем файл
wb.save("pers.xlsx")

введите сюда описание изображения

→ Ссылка
Автор решения: Fox Fox

Я, глядя на данные, не смог сдержать улыбку. Имена перепутаны с фамилиями, 18-летний Иванов имеет 3 ребёнка (!), а у Петрова нет даже их нуля. Любой, хоть сколько-нибудь грамотный и умелый менеджер, скажет, что характеристики - это колонки, почти всегда, а субъекты учёта - в данном случае люди - строки. Иначе, сколько субъектов сможет вместить такая таблица и насколько она будет читабельна? В правильно спроектированной таблице можно будет нормально и сортировать по колонкам, и устанавливать фильтры, и даже без напрягов сохранить в csv для использования в других программах.

Я покажу пример такого алгоритма (потребуется установка модуля openpyxl):

import os
import openpyxl

# Данные
person1 = {"Фамилия": "Иванов", "Имя": "Иван", "Дети": 3, "Возраст": 28}
person2 = {"Фамилия": "Петров", "Имя": "Пётр", "Дети": 0, "Возраст": 18}
person3 = {"Фамилия": "Сидоров", "Имя": "Сидор", "Дети": 1, "Возраст": 25}
citizens = [person1, person2, person3]

# Создание Excel файла
wb = openpyxl.Workbook() # книга
ws = wb.active # активный лист
ws.append(list(citizens[0].keys())) # запись заголовка
for person in citizens: ws.append(list(person.values())) # запись данных
wb.save("citizens.xlsx") # сохранение файла

print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul")

Пример полностью готов, сохраните текст как .py, установите openpyxl и можете тестировать и адаптировать для себя.

→ Ссылка