Python: преобразовать список словаря в таблицу - PullRequest
0 голосов
/ 11 марта 2020

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

my_dict = [ {'type' : 'type_1', 'prob' : 2, 'x_sum' : 3, 'y_sum' : 5}
 {'type' : 'type_2', 'prob' : 3, 'x_sum' : 8, 'y_sum' : 6}]

Я хочу напечатать его в виде таблицы:

type  |prob|x_sum|y_sum
type_1|2   |3    |5
type_2|3   |8    |6

Я пробовал это решение:

for row in zip(*([key] + value for key, value in sorted(my_dict.items()))):
print(*row)

но получил ошибку: AttributeError: у объекта 'list' нет атрибута 'items' Как я могу исправить проблему со списком?

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Проще всего использовать Pandas, как описано Преобразовать список словарей в кадр данных

Код

import pandas as pd

my_dict = [ {'type' : 'type_1', 'prob' : 2, 'x_sum' : 3, 'y_sum' : 5},
 {'type' : 'type_2', 'prob' : 3, 'x_sum' : 8, 'y_sum' : 6}]

df = pd.DataFrame(my_dict)
print(df)

Вывод

     type  prob  x_sum  y_sum
0  type_1     2      3      5
1  type_2     3      8      6

Без индексного столбца

df_no_indices = df.to_string(index=False)
print(df_no_indices)

Выход

  type  prob  x_sum  y_sum
 type_1     2      3      5
 type_2     3      8      6

Другое Примеры форматов

Источник

Сообщение SQL

from tabulate import tabulate
pdtabulate=lambda df:tabulate(df,headers='keys',tablefmt='psql')
print(pdtabulate(df))

+----+--------+--------+---------+---------+
|    | type   |   prob |   x_sum |   y_sum |
|----+--------+--------+---------+---------|
|  0 | type_1 |      2 |       3 |       5 |
|  1 | type_2 |      3 |       8 |       6 |
+----+--------+--------+---------+---------+

HTML

pdtabulate=lambda df:tabulate(df,headers='keys',tablefmt='html')
print(pdtabulate(df))

<table>
<thead>
<tr><th style="text-align: right;">  </th><th>type  </th><th style="text-align: right;">  prob</th><th style="text-align: right;">  x_sum</th><th style="text-align: right;">  y_sum</th></tr>
</thead>
<tbody>
<tr><td style="text-align: right;"> 0</td><td>type_1</td><td style="text-align: right;">     2</td><td style="text-align: right;">      3</td><td style="text-align: right;">      5</td></tr>
<tr><td style="text-align: right;"> 1</td><td>type_2</td><td style="text-align: right;">     3</td><td style="text-align: right;">      8</td><td style="text-align: right;">      6</td></tr>
</tbody>
</table>
1 голос
/ 11 марта 2020

вы можете использовать:

from collections import defaultdict

r = defaultdict(list)
for d in my_dict:
    for k, v in d.items():
        r[k].append(v)

print('|'.join((e.ljust(7) for e in d.keys())))

print('\n'.join(('|'.join(str(e).ljust(7) for e in t) for t in zip(*r.values()) )))

вывод:

type   |prob   |x_sum  |y_sum  
type_1 |2      |3      |5      
type_2 |3      |8      |6 
...