将字典打印为表格数据

4

我想以表格格式打印Python字典,但是在处理字典时遇到了困难。以下是我的字典:

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           │
╘════════╧═════════╧═══════╧═════════╧═════════════════╛

非常感谢您的帮助。

2个回答

5
您需要将字典转换为数据框。请尝试以下操作:
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'

1
哇!太完美了!我安装了 pandas 并检查过了,一切都很完美!谢谢。 - DonOfDen
1
非常欢迎。请查看我的编辑,关于总计行的问题。祝你的项目好运。 - petezurich
1
Decimal('1') 是我添加的内容,但更新后的解决方案节省了更多时间。感谢祝福,完成后我会分享项目...这是一个开源项目 :) - DonOfDen

2
你需要将字典更改为预期格式之一,例如字典列表:[{**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”时遇到伪图形的问题,请将其删除。您可能需要手动添加总和。"Original Answer"翻译成"最初的回答"。

我尝试移除“fancy_grid”,但没有帮助...输出仍然相同...是的,我可以理解总和应该是一个单独的计算.. @Serge - DonOfDen
我忘了提到你应该将字典转换为更简单的格式,以便于这个简单的制表库清晰地处理。 - Serge

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