垂直打印字典中的列表

2 投票
2 回答
11500 浏览
提问于 2025-04-18 06:17

我想把下面这个包含列表的字典竖着打印出来:

result = {'WeightedLevel': [388.850952, 716.718689, 1312.55957, 2405.087158, 4460.083984, 8543.792969, 18805.201172, 57438.140625, 1792.367554], 'Job': 'Desktop', 'LoadLevel': [0.212399, 0.393191, 0.727874, 1.347436, 2.494368, 4.617561, 8.548006, 15.824027, 1.0], 'Task': 'test', 'Failure': [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0], 'Blocks': [7255.151855, 231.589661, 9.365415, 0.55364, 0.0504, 0.006408, 0.001204, 0.000842, 2.060041]}

所以它应该看起来像这样:

Job           Task          LoadLevel         Blocks          Failure         WeightedLevel
Desktop       test          4546543           4384284         0,46544564      0,1354385
                            474454            978456          2               9655
                            9655              55654           966             665 

还有等等……

我试过一些在网上找到的代码,但它们还是横着打印结果:

for k, d in result.items():
    print(k + ":", d)         

还有

print("\t".join(str(x) for x in result))

2 个回答

0

如果它们的长度都一样,那就简单多了。你需要做的是把字典拆开,然后用循环来打印,每次打印的时候可以用print语句中的end参数来控制换行。

可以参考下面的例子。如果把每个项目都变成长度相同的列表,那就更简单了。

def print_dict_table(result):
    """Print a dictionary of lists like a table.

    Args:
        result (dict): Dictionary of lists to print as a table.
    """
    # Count the longest value
    keys = result.keys()
    count = 0
    for i in result.values():
        if isinstance(i, list) and len(i) > count:
            count = len(i)

    # print header
    for i in keys:
        print(i, end="\t")
    print()

    # print columns
    for i in range(count):
        for j in keys:
            if isinstance(result[j], list) and len(result[j]) >= i:
                    print(result[j][i], end="\t")
            else:
                print(result[j], end="\t")
        print()
# end print_dict_table


result = {'WeightedLevel': [388.850952, 716.718689, 1312.55957, 2405.087158, 4460.083984, 8543.792969, 18805.201172, 57438.140625, 1792.367554], 'Job': 'Desktop', 'LoadLevel': [0.212399, 0.393191, 0.727874, 1.347436, 2.494368, 4.617561, 8.548006, 15.824027, 1.0], 'Task': 'test', 'Failure': [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0], 'Blocks': [7255.151855, 231.589661, 9.365415, 0.55364, 0.0504, 0.006408, 0.001204, 0.000842, 2.060041]}

print_dict_table(result)

结果

Failure Job LoadLevel   WeightedLevel   Task    Blocks  
2.0 Desktop 0.212399    388.850952  test    7255.151855 
2.0 Desktop 0.393191    716.718689  test    231.589661  
2.0 Desktop 0.727874    1312.55957  test    9.365415    
2.0 Desktop 1.347436    2405.087158 test    0.55364 
2.0 Desktop 2.494368    4460.083984 test    0.0504  
2.0 Desktop 4.617561    8543.792969 test    0.006408    
2.0 Desktop 8.548006    18805.201172    test    0.001204    
2.0 Desktop 15.824027   57438.140625    test    0.000842    
2.0 Desktop 1.0 1792.367554 test    2.060041    

字典是没有顺序的。老实说,我建议你重新考虑一下你的数据结构。如果这是表格数据,那就用表格来表示。

6

漂亮地打印表格需要写很多代码,像是table-recipepretty-table这些工具。随便写这种代码可没意思,不如直接用一个设计得好的模块。

如果你有pandas这个库,可以把字典直接放进一个数据框(DataFrame)里,然后像这样打印出来:

In [4]: import pandas as pd
In [5]: result = {'WeightedLevel': [388.850952, 716.718689, 1312.55957, 2405.087158, 4460.083984, 8543.792969, 18805.201172, 57438.140625, 1792.367554], 'Job': 'Desktop', 'LoadLevel': [0.212399, 0.393191, 0.727874, 1.347436, 2.494368, 4.617561, 8.548006, 15.824027, 1.0], 'Task': 'test', 'Failure': [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0], 'Blocks': [7255.151855, 231.589661, 9.365415, 0.55364, 0.0504, 0.006408, 0.001204, 0.000842, 2.060041]}

In [6]: pd.DataFrame(result)
Out[6]: 
        Blocks  Failure      Job  LoadLevel  Task  WeightedLevel
0  7255.151855        2  Desktop   0.212399  test     388.850952
1   231.589661        2  Desktop   0.393191  test     716.718689
2     9.365415        2  Desktop   0.727874  test    1312.559570
3     0.553640        2  Desktop   1.347436  test    2405.087158
4     0.050400        2  Desktop   2.494368  test    4460.083984
5     0.006408        2  Desktop   4.617561  test    8543.792969
6     0.001204        2  Desktop   8.548006  test   18805.201172
7     0.000842        2  Desktop  15.824027  test   57438.140625
8     2.060041        2  Desktop   1.000000  test    1792.367554

[9 rows x 6 columns]

这里有一种方法,可以在不使用第三方模块的情况下,把字典以表格的形式打印出来:

import itertools as IT

result = {'WeightedLevel': [388.850952, 716.718689, 1312.55957, 2405.087158, 4460.083984, 8543.792969, 18805.201172, 57438.140625, 1792.367554], 'Job': 'Desktop', 'LoadLevel': [0.212399, 0.393191, 0.727874, 1.347436, 2.494368, 4.617561, 8.548006, 15.824027, 1.0], 'Task': 'test', 'Failure': [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0], 'Blocks': [7255.151855, 231.589661, 9.365415, 0.55364, 0.0504, 0.006408, 0.001204, 0.000842, 2.060041]}

matrix = zip(*[value if isinstance(value, list) else IT.repeat(value) for key,value in result.items()])
print(''.join(['{:15}'.format(key) for key in result.keys()]))
for row in matrix:
    print(''.join(['{:15}'.format(str(item)) for item in row]))

结果是

Task           Blocks         LoadLevel      Failure        Job            WeightedLevel  
test           7255.151855    0.212399       2.0            Desktop        388.850952     
test           231.589661     0.393191       2.0            Desktop        716.718689     
test           9.365415       0.727874       2.0            Desktop        1312.55957     
test           0.55364        1.347436       2.0            Desktop        2405.087158    
test           0.0504         2.494368       2.0            Desktop        4460.083984    
test           0.006408       4.617561       2.0            Desktop        8543.792969    
test           0.001204       8.548006       2.0            Desktop        18805.201172   
test           0.000842       15.824027      2.0            Desktop        57438.140625   
test           2.060041       1.0            2.0            Desktop        1792.367554    

撰写回答