Печать в виде табличных данных
Я пытаюсь напечатать dict dict в табличном формате, но сталкиваюсь с трудностями при работе с dict. Следующее - мой дикт:
board_dict =
{
'Done': {
'point': 0.0,
'items': 1
},
'Doing': {
'point': 24.0,
'items': 3
},
'New': {
'point': 0.0,
'items': 2
},
'Stuck': {
'point': 19.0,
'items': 3
},
'Ready to Test': {
'point': Decimal('1'),
'items': 1
}
}
Я пытаюсь создать что-то вроде этого:
Column Items Points
------ ----- ------
Sprint Backlog 0 0
Doing 3 24
Stuck 3 19
Code Review 0 0
Ready to Test 1 1
Done 1 0
------
Total 8 44
------
Я пробовал следующее с помощью Python tabulate
https://pypi.org/project/tabulate/
print(tabulate(board_dict, headers="keys", tablefmt="fancy_grid"))
╒════════╤═════════╤═══════╤═════════╤═════════════════╕
│ Done │ Doing │ New │ Stuck │ Ready to Test │
╞════════╪═════════╪═══════╪═════════╪═════════════════╡
│ point │ point │ point │ point │ point │
├────────┼─────────┼───────┼─────────┼─────────────────┤
│ items │ items │ items │ items │ items │
╘════════╧═════════╧═══════╧═════════╧═════════════════╛
Любая помощь будет очень ценной.
2 ответа
Вам нужно преобразовать dict в информационный кадр. Попробуй это:
df = pd.DataFrame(board_dict)
print(tabulate(df.T, headers="keys"))
Это распечатывает:
items point
------------- ------- -------
Done 1 0
Doing 3 24
New 2 0
Stuck 3 19
Ready to Test 1 1
Если вам также нужна сумма, попробуйте это:
df = pd.DataFrame(board_dict)
df = df.T
df.columns = ["_items", "_points"]
df = df.astype(int)
df.loc["Total"] = df.sum().T
print(tabulate(df, headers="keys"))
Это распечатывает:
_items _points
------------- -------- ---------
Done 1 0
Doing 3 24
New 2 0
Stuck 3 19
Ready to Test 1 1
Total 10 44
Обратите внимание, что items
не является хорошим именем столбца, так как оно также является именем функции Python. Поэтому я изменил его на _items
,
Я также изменил эту строчку в твоих словах 'point': Decimal('1')
к этой линии 'point':'1'
Вам нужно изменить словарь на один из ожидаемых форматов, например. список словарей: [{**v, 'column': k } for k, v in d.items() ]
вместо оригинального словаря
Список списков может быть еще проще для понимания
tabulate( [[k, v['items'], v['point'] for k, v in d.items()],
headers = ['columns', 'items', 'points'])
Словарь списка также поддерживается:
keys = d.keys()
values = d.values() )
d2 = { 'columns': keys,
'items': [v['items'] for v in values],
'points': [v['point'] for v in values]
}
tabulate(d2, headers = 'keys')
Также, если у вас есть проблема с псевдографикой из "fancy_grid", удалите ее. Сумма, которую вам может понадобиться добавить вручную