【问题标题】:Printing dict as tabular Data将dict打印为表格数据
【发布时间】:2019-08-24 05:18:13
【问题描述】:

我正在尝试以表格格式打印 python dict,但在使用 dict 时遇到困难。以下是我的字典:

board_dict =

    {
        'Done': {
            'point': 0.0,
            'items': 1
        },
        'Doing': {
            'point': 24.0,
            'items': 3
        },
        'New': {
            'point': 0.0,
            'items': 2
        },
        'Stuck': {
            'point': 19.0,
            'items': 3
        },
        'Ready to Test': {
            'point': Decimal('1'),
            'items': 1
        }
    }

我正在尝试设计这样的东西:

Column         Items Points
------         ----- ------
Sprint Backlog 0     0
Doing          3     24
Stuck          3     19
Code Review    0     0
Ready to Test  1     1
Done           1     0
------               
Total          8     44
------  

我使用 python tabulate https://pypi.org/project/tabulate/ 尝试了以下操作

print(tabulate(board_dict, headers="keys", tablefmt="fancy_grid"))


╒════════╤═════════╤═══════╤═════════╤═════════════════╕
│ Done   │ Doing   │ New   │ Stuck   │ Ready to Test   │
╞════════╪═════════╪═══════╪═════════╪═════════════════╡
│ point  │ point   │ point │ point   │ point           │
├────────┼─────────┼───────┼─────────┼─────────────────┤
│ items  │ items   │ items │ items   │ items           │
╘════════╧═════════╧═══════╧═════════╧═════════════════╛

任何帮助将不胜感激。

【问题讨论】:

    标签: python tabulate


    【解决方案1】:

    您需要将字典更改为预期格式之一,例如。字典列表:[{**v, 'column': k } for k, v in d.items() ] 而不是原来的字典

    列表列表可能更容易理解

    tabulate( [[k, v['items'], v['point'] for k, v in d.items()],
               headers = ['columns', 'items', 'points'])
    

    还支持列表字典:

        keys = d.keys()
        values = d.values() )          
        d2 = { 'columns': keys, 
               'items': [v['items'] for v in values], 
               'points': [v['point'] for v in values]
        }
    
        tabulate(d2, headers = 'keys')
    

    此外,如果您对“fancy_grid”中的伪图形有疑问,请将其删除。您可能需要手动添加的总和

    【讨论】:

    • 我测试了删除“fancy_grid”,但它没有帮助......输出仍然相同......是的,我可以理解总和应该是一个单独的计算......@Serge
    • 我忘了说你应该把字典改成更简单的格式,这个简单的制表库很清楚。
    【解决方案2】:

    您需要将 dict 转换为数据框。试试这个:

    df = pd.DataFrame(board_dict)
    print(tabulate(df.T, headers="keys"))
    

    打印出来:

                     items    point
    -------------  -------  -------
    Done                 1        0
    Doing                3       24
    New                  2        0
    Stuck                3       19
    Ready to Test        1        1
    

    如果你也需要总和,试试这个:

    df = pd.DataFrame(board_dict)
    df = df.T
    df.columns = ["_items", "_points"]
    df = df.astype(int)
    df.loc["Total"] = df.sum().T
    print(tabulate(df, headers="keys"))
    

    打印出来:

                     _items    _points
    -------------  --------  ---------
    Done                  1          0
    Doing                 3         24
    New                   2          0
    Stuck                 3         19
    Ready to Test         1          1
    Total                10         44
    

    请注意,items 不是一个好的列名,因为它也是 Python 函数名。所以我把它改成了_items

    我还将您的字典中的这一行 'point': Decimal('1') 更改为这一行 'point':'1'

    【讨论】:

    • 哇!完美的!我安装了pandas 并检查了它,它是完美的!谢谢。
    • 不客气。请参阅我对总计行的编辑。祝你的项目好运。
    • Decimal('1') 是我要添加的内容,但更新后的解决方案为我节省了更多时间。感谢您的祝福,完成后将分享该项目..这是一个开源项目:)
    猜你喜欢
    • 2012-03-21
    • 2020-09-17
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多