垂直打印字典中的列表
我想把下面这个包含列表的字典竖着打印出来:
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-recipe和pretty-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