如何将列表字典格式化为表格
我有一个dict
,里面包含了一些字符串的列表,我想把这些内容打印成一个表格,格式大概是这样的:
+----------------------------------------------+
| key1 | key2 | key3 | key4 |
+----------------------------------------------+
| val_1 | val_1 | val_1 | val_1 |
|----------|----------|-----------|------------|
| val_2 | val_2 | val_2 | val_2 |
+----------------------------------------------+
等等。
有没有什么很棒的模块或者简单的方法可以做到这一点?我有一个列宽的列表,是通过找出每个列表中最长的值来得到的。
4 个回答
1
关于key1、key2、key3等的问题在于,字典里的键是没有顺序的。因此,我觉得可以把你的字典改成一个键值对的列表,这样就能给键加上顺序了:
你可以这样做:
d = [ ('Coco', ['verde', 'redondo'] ),
('Plátano', ['amarillo', 'doblado'] ),
('Fresa', ['rojo', 'redondo chiquito'] ) ]
def makeTable (d):
widths = [2 + max ( [len (k) ] + [len (v) for v in vs] ) for k, vs in d]
formats = ['{:^%s}' % width for width in widths]
values = zip (* ( [k] + vs for k, vs in d) )
sep = '\n+' + '-' * (sum (widths) + len (d) - 1) + '+\n'
rows = sep.join ('|{}|'.format ('|'.join (formats [i].format (k) for i, k in enumerate (vs) ) ) for vs in values)
return sep + rows + sep
print (makeTable (d) )
要把字典转换成一个元组列表,只需使用 [ (k, v) for k, v in d.items () ]
。
把这两件事结合起来,就会得到:
d = {'Coco': ['verde', 'redondo'],
'Plátano': ['amarillo', 'doblado'],
'Fresa': ['rojo', 'redondo chiquito'] }
print (makeTable ( [ (k, v) for k, v in d.items () ] ) )
4
TextTable可以正常工作,并且可以通过以下方式安装:
pip install texttable
http://foutaise.org/code/texttable/
https://pypi.python.org/pypi?name=texttable&:action=display
在一个映射中,键是没有排序的,所以你不能指望它们会按照特定的顺序出现。
TextTable只接受行优先的表格排列方式,所以你需要用一些小技巧来处理迭代器:
import texttable
import itertools
theDict = {"key1": ["val_1", "val_2"],
"key2": ["val_1", "val_2"],
"key3": ["val_1", "val_2"],
"key4": ["val_1", "val_2"]}
theTable = texttable.Texttable()
theIter = itertools.chain(
iter([theDict.keys()]),
itertools.imap(lambda *x: list(x), *theDict.itervalues())
)
theTable.add_rows(theIter)
print theTable.draw()
这样就能得到:
+-------+-------+-------+-------+
| key3 | key2 | key1 | key4 |
+=======+=======+=======+=======+
| val_1 | val_1 | val_1 | val_1 |
+-------+-------+-------+-------+
| val_2 | val_2 | val_2 | val_2 |
+-------+-------+-------+-------+
8
你可以使用 PrettyTable
。
- 我对键进行了排序,也对值进行了排序。这样可以得到一个可预测的输出结果。
- 我选择了PrettyTable,因为它可以通过
apt-get install python-prettytable
在Ubuntu上安装。
.
#! /usr/bin/env python
from prettytable import PrettyTable
d1 = {
"key1":["val1_1", "val1_2"],
"key2":["val2_1", "val2_2"],
"key3":["val3_1", "val3_2"],
"key4":["val4_1", "val4_2"],
}
table = PrettyTable()
for key,val in sorted(d1.iteritems()):
table.add_column(key, sorted(val))
print table
结果是:
$ ./t
+--------+--------+--------+--------+
| key1 | key2 | key3 | key4 |
+--------+--------+--------+--------+
| val1_1 | val2_1 | val3_1 | val4_1 |
| val1_2 | val2_2 | val3_2 | val4_2 |
+--------+--------+--------+--------+
PrettyTable还提供了HTML格式的功能。把 print table
替换成:
print table.get_html_string(attributes={"size":"100%", "class":"MyTable"})
你就会得到:
<table border="1" class="MyTable" size="100%">
<tr>
<th>key1</th>
<th>key2</th>
<th>key3</th>
<th>key4</th>
</tr>
<tr>
<td>val1_1</td>
<td>val2_1</td>
<td>val3_1</td>
<td>val4_1</td>
</tr>
<tr>
<td>val1_2</td>
<td>val2_2</td>
<td>val3_2</td>
<td>val4_2</td>
</tr>
</table>