4

我有一个dict包含字符串的列表,并且希望将所有内容打印为终端中的表格,格式如下:

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

等等

是否有一个惊人的模块或实现这一目标的简单方法?我有一个列宽列表,通过在每个列表中找到最长的 val 得到。

4

4 回答 4

8

你可以使用PrettyTable.

  • 我对键进行了排序,并对值进行了排序。这会产生可预测的输出。
  • 我选择 PrettyTable 是因为它可以通过apt-get install python-prettytable.

.

#! /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>
于 2013-02-21T01:51:47.933 回答
4

TextTable 工作,可以通过安装

pip install texttable

http://fotaise.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 |
+-------+-------+-------+-------+
于 2013-02-21T01:27:31.400 回答
1

key1、key2、key3 等的问题是 key 中的 dicts 没有排序。因此,我觉得很自由,可以将您的 dict 更改为键值元组列表,以便对键进行排序:

然后你可以做这样的事情:

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

要将 dict 转换为元组列表,只需使用[ (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 () ] ) )
于 2013-02-21T01:48:52.817 回答
0

如果您只需要它以格式良好的方式查看字典的内容,您可以尝试使用Python dict 格式化程序和查看器,它似乎正是为此而设计的 - 它可以显示 dict(或dicts)作为表格或树。

于 2013-04-07T16:56:28.667 回答