[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-loops를 시도했으며 문자열로 인쇄를 시도했습니다.

이 작업을 수행하는 매우 간단한 방법이 있어야하지만 경험 부족으로 인해 누락 될 수 있습니다.



답변

Python 2.7 용 임시 코드 :

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()하고 형식 사양 미니 언어 .


답변

이 목적을 위해 가볍고 유용한 파이썬 패키지가 있습니다 :

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  |
+-------+-----+

텍스트 테이블을 사용하면 가로 / 세로 정렬, 테두리 스타일 및 데이터 형식을 제어 할 수 있습니다.

4. termtables : 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  |
+-------+-----+

텍스트 테이블을 사용하면 가로 / 세로 정렬, 테두리 스타일 및 데이터 형식을 제어 할 수 있습니다.

다른 옵션:

  • terminaltables 문자열 목록에서 터미널 / 콘솔 응용 프로그램의 테이블을 쉽게 그립니다. 여러 줄을 지원합니다.
  • asciitable Asciitable은 내장 확장 리더 클래스를 통해 광범위한 ASCII 테이블 형식을 읽고 쓸 수 있습니다.

답변

>>> 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        


답변

파이썬은 실제로 이것을 아주 쉽게 만듭니다.

같은 것

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

문자열 내의 %는 본질적으로 이스케이프 문자이며 그 뒤에 오는 문자는 파이썬에게 데이터의 형식이 무엇인지 알려줍니다. 문자열 외부 및 이후 %는 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 3.4에서 작동하도록 Sven Marnach의 답변 업데이트 :

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))


답변

이 작업을 수행 할 때 테이블의 형식 지정 방법에 대한 세부 정보를 제어하고 싶습니다. 특히 헤더 셀이 본문 셀과 다른 형식을 갖기를 원하며 테이블 열 너비는 각 너비만큼 넓어야합니다. 내 해결책은 다음과 같습니다.

def format_matrix(header, matrix,
                  top_format, left_format, cell_format, row_delim, col_delim):
    table = [[''] + header] + [[name] + row for name, row in zip(header, matrix)]
    table_format = [['{:^{}}'] + len(header) * [top_format]] \
                 + len(matrix) * [[left_format] + len(header) * [cell_format]]
    col_widths = [max(
                      len(format.format(cell, 0))
                      for format, cell in zip(col_format, col))
                  for col_format, col in zip(zip(*table_format), zip(*table))]
    return row_delim.join(
               col_delim.join(
                   format.format(cell, width)
                   for format, cell, width in zip(row_format, row, col_widths))
               for row_format, row in zip(table_format, table))

print format_matrix(['Man Utd', 'Man City', 'T Hotspur', 'Really Long Column'],
                    [[1, 2, 1, -1], [0, 1, 0, 5], [2, 4, 2, 2], [0, 1, 0, 6]],
                    '{:^{}}', '{:<{}}', '{:>{}.3f}', '\n', ' | ')

출력은 다음과 같습니다.

                   | Man Utd | Man City | T Hotspur | Really Long Column
Man Utd            |   1.000 |    2.000 |     1.000 |             -1.000
Man City           |   0.000 |    1.000 |     0.000 |              5.000
T Hotspur          |   2.000 |    4.000 |     2.000 |              2.000
Really Long Column |   0.000 |    1.000 |     0.000 |              6.000


답변

나는 이것이 당신이 찾고있는 것이라고 생각 합니다 .

테이블 항목에 필요한 최대 너비를 계산 한 다음 rjustljust 를 사용 하여 데이터를 예쁘게 인쇄 하는 간단한 모듈입니다 .

왼쪽 머리글 오른쪽을 정렬하려면이 호출을 변경하십시오.

 print >> out, row[0].ljust(col_paddings[0] + 1),

53 행 :

 print >> out, row[0].rjust(col_paddings[0] + 1),