将列表打印为表格数据
我对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”即可