将列表打印为表格数据

我对Python非常陌生,现在我正在努力将我的数据格式化为打印输出。

我有一个用于两个标题的列表,以及一个应该是表格内容的matrix。 像这样:

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

请注意,标题名称不一定是相同的长度。 尽pipe如此,数据条目都是整数。

现在,我想用表格的forms来表示,如下所示:

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

我有一个预感,必须有一个这样的数据结构,但我找不到它。 我已经尝试使用字典和格式化打印,我已经尝试了与缩进循环,我已经尝试打印为string。

我相信肯定有一个非常简单的方法来做到这一点,但由于缺乏经验,我可能会错过它。

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()和Format Specification Mini-Language 。

有一些轻量级和有用的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 

制表有许多选项来指定标题和表格格式。

 >>> 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数据库读取数据的选项。 您也可以select数据的子集,sorting表和更改表格样式。

3. texttable : 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你可以控制水平/垂直alignment,边框样式和数据types。

其他选项:

  • terminaltables从一系列string列表中轻松地在terminal/控制台应用程序中绘制表格。 支持多行的行。
  • 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 

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 

string中的%本质上是一个转义字符,它后面的字符告诉python数据应该具有什么样的格式。 string之外和之后的%是告诉python你打算使用前面的string作为格式string,并且下面的数据应该被放入指定的格式。

在这种情况下,我使用了“%-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

BeautifulTable和Tabulate是你可以用来解决你的问题的许多软件包中的一部分。

这里是一个美丽的文档的例子

 >>> from beautifultable import BeautifulTable >>> table = BeautifulTable() >>> table.column_headers = ["name", "rank", "gender"] >>> table.append_row(["Jacob", 1, "boy"]) >>> table.append_row(["Isabella", 1, "girl"]) >>> table.append_row(["Ethan", 2, "boy"]) >>> table.append_row(["Sophia", 2, "girl"]) >>> table.append_row(["Michael", 3, "boy"]) >>> print(table) +----------+------+--------+ | name | rank | gender | +----------+------+--------+ | Jacob | 1 | boy | +----------+------+--------+ | Isabella | 1 | girl | +----------+------+--------+ | Ethan | 2 | boy | +----------+------+--------+ | Sophia | 2 | girl | +----------+------+--------+ | Michael | 3 | boy | +----------+------+--------+ 

我想这就是你要找的。

这是一个简单的模块,它只是计算表格条目的最大宽度,然后使用rjust和ljust来做一个漂亮的数据打印。

如果你想要左alignment右alignment只是改变这个调用:

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

从第53行开始:

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

更新Sven Marnach的Python 3.4的工作答案:

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

当我这样做时,我喜欢对表格格式的细节进行一些控制。 特别是,我希望标题单元格的格式与主体单元格不同,并且表格列的宽度只能与每个单元格的宽度相同。 这是我的解决scheme:

 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 

我会尝试遍历列表并使用CSV格式化程序来表示您想要的数据。

您可以指定制表符,逗号或其他字符作为分隔符。

否则,只需遍历列表并在每个元素后面打印“\ t”即可

http://docs.python.org/library/csv.html