如何将一个字典列表格式化为表格

4

我有一个包含字符串列表的 dict,想要将所有内容以表格形式在终端中打印出来,格式类似于:

+----------------------------------------------+
|   key1   |   key2   |   key3    |    key4    |
+----------------------------------------------+
|   val_1  |   val_1  |   val_1   |   val_1    |
|----------|----------|-----------|------------|
|   val_2  |   val_2  |   val_2   |   val_2    |
+----------------------------------------------+

有什么神奇的模块或简单的方法可以实现这个目标吗?我有一个列宽度的列表,我通过查找每个列表中最长的值来获取它们。

4个回答

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>

4

TextTable可以工作,并且可以通过以下方式进行安装:

pip install texttable

http://foutaise.org/code/texttable/

https://pypi.python.org/pypi?name=texttable&:action=display

Map中的键不会排序,因此不能保证特定顺序。

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

1
你的回答应该包含更多的信息而不仅仅是一个链接。请参考:在其他地方只包含链接的答案真的是好答案吗? - Joel Cornett
@JoelCornett 我知道,但我想这个问题会比我写示例代码更快得到解答,所以我想先占个位。 - Soverman

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

还有 collections.OrderedDict 类型。 - askewchan
另一个可行的选择基本上归结为相同的事情。 - Hyperboreus

0

如果您只需要以良好格式查看字典的内容,可以尝试使用Python dict formatter and viewer。这个工具似乎完全针对这一点-它可以将字典(或一个字典列表)显示为表格或树形结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接