【问题标题】:How to format a dict of lists as a table如何将列表的字典格式化为表格
【发布时间】:2013-02-21 01:24:22
【问题描述】:

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

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

等等

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

【问题讨论】:

    标签: python formatting


    【解决方案1】:

    你可以使用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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案3】:

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

      要将字典转换为元组列表,只需使用[ (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】:

      如果您只需要它以格式良好的方式查看字典的内容,您可以尝试Python dict formatter and viewer,它似乎正是为此 - 它可以显示字典(或列表dicts) 作为表或树。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 2016-08-02
        • 2018-03-07
        • 1970-01-01
        • 2016-10-10
        • 2019-09-25
        • 1970-01-01
        相关资源
        最近更新 更多