Вопрос-Ответ

Printing Lists as Tabular Data

Печать списков в виде табличных данных

Я совсем новичок в Python, и сейчас мне трудно правильно форматировать свои данные для вывода на печать.

У меня есть один список, который используется для двух заголовков, и матрица, которая должна быть содержимым таблицы. Вот так:

teams_list = ["Man Utd", "Man City", "T Hotspur"]
data = np.array([[1, 2, 1],
[0, 1, 0],
[2, 4, 2]])

Обратите внимание, что названия заголовков не обязательно имеют одинаковую длину. Однако все записи данных представляют собой целые числа.

Теперь я хочу представить это в табличном формате, что-то вроде этого:

            Man Utd   Man City   T Hotspur
Man Utd 1 0 0
Man City 1 1 0
T Hotspur 0 1 2

У меня есть предположение, что для этого должна быть структура данных, но я не могу ее найти. Я пробовал использовать словарь и форматировать печать, я пробовал циклы for с отступом и я пробовал печатать в виде строк.

Я уверен, что должен быть очень простой способ сделать это, но я, вероятно, упускаю его из-за отсутствия опыта.

Переведено автоматически
Ответ 1

Для этой цели существует несколько легких и полезных пакетов python:

1. составление таблиц: https://pypi.python.org/pypi/tabulate

from tabulate import tabulate
print(tabulate([['Alice', 24], ['Bob', 19]], headers=['Name', 'Age']))
Name      Age
------ -----
Alice 24
Bob 19

в tabulate есть множество опций для указания заголовков и формата таблицы.

print(tabulate([['Alice', 24], ['Bob', 19]], headers=['Name', 'Age'], tablefmt='orgtbl'))
| Name   |   Age |
|--------+-------|
| Alice | 24 |
| Bob | 19 |

2. PrettyTable: https://pypi.python.org/pypi/PrettyTable

from prettytable import PrettyTable
t = PrettyTable(['Name', 'Age'])
t.add_row(['Alice', 24])
t.add_row(['Bob', 19])
print(t)
+-------+-----+
| Name | Age |
+-------+-----+
| Alice | 24 |
| Bob | 19 |
+-------+-----+

В PrettyTable есть опции для чтения данных из баз данных csv, html, sql. Также вы можете выбирать подмножества данных, сортировать таблицу и изменять стили таблиц.

3. текстовая таблица: https://pypi.python.org/pypi/texttable

from texttable import Texttable
t = Texttable()
t.add_rows([['Name', 'Age'], ['Alice', 24], ['Bob', 19]])
print(t.draw())
+-------+-----+
| Name | Age |
+=======+=====+
| Alice | 24 |
+-------+-----+
| Bob | 19 |
+-------+-----+

с помощью texttable вы можете управлять выравниванием по горизонтали / вертикали, стилем границ и типами данных.

4. таблицы терминов: https://github.com/nschloe/termtables

import termtables as tt

string = tt.to_string(
[["Alice", 24], ["Bob", 19]],
header=["Name", "Age"],
style=tt.styles.ascii_thin_double,
# alignment="ll",
# padding=(0, 1),
)
print(string)
+-------+-----+
| Name | Age |
+=======+=====+
| Alice | 24 |
+-------+-----+
| Bob | 19 |
+-------+-----+

с помощью texttable вы можете управлять выравниванием по горизонтали / вертикали, стилем границ и типами данных.

Другие опции:


  • terminaltables Легко рисуют таблицы в терминальных / консольных приложениях из списка списков строк. Поддерживает многострочные строки.

  • asciitable Asciitable может читать и записывать широкий спектр форматов таблиц ASCII с помощью встроенных классов расширения для чтения.

Ответ 2

Немного специального кода:

row_format ="{:>15}" * (len(teams_list) + 1)
print(row_format.format("", *teams_list))
for team, row in zip(teams_list, data):
print(row_format.format(team, *row))

Это зависит от str.format() и мини-языка спецификации формата.

Ответ 3
>>> import pandas
>>> pandas.DataFrame(data, teams_list, teams_list)
Man Utd Man City T Hotspur
Man Utd 1 2 1
Man City 0 1 0
T Hotspur 2 4 2
Ответ 4

На самом деле Python делает это довольно простым.

Что-то вроде

for i in range(10):
print '%-12i%-12i' % (10 ** i, 20 ** i)

будет иметь следующий результат

1           1           
10 20
100 400
1000 8000
10000 160000
100000 3200000
1000000 64000000
10000000 1280000000
100000000 25600000000
1000000000 512000000000

% в строке по сути является escape-символом, а символы, следующие за ним, сообщают python, какой формат должны иметь данные. % вне и после строки сообщает python, что вы намерены использовать предыдущую строку в качестве строки формата и что следующие данные должны быть помещены в указанный формат.

В этом случае я дважды использовал "%-12i". Чтобы разбить каждую часть:

'-' (left align)
'12' (how much space to be given to this part of the output)
'i' (we are printing an integer)

Из документации: https://docs.python.org/2/library/stdtypes.html#string-formatting

python