定义一个可以整齐地打印字典的函数

Defining a function that prints dictionaries neatly

我一直想整齐地打印一本字典,所以我想出了这个:

test = {
    "test0": [1, 2],
    "test1": [3, 4],
    "test2": [5, 6],
    "test3": [7, 8],
    "test4": [9, 10]
}

keys = list(test.keys())
keys.sort()
print("Col1      Col2  Col3")
for x in range(5):
    check_1 = (test["test{0}".format(x)][0])
    check_2 = (test["test{0}".format(x)][1])
    print("test{0}".format(x), check_1, check_2, sep = '     ')

这样打印:

Col1      Col2  Col3
test0     1     2
test1     3     4
test2     5     6
test3     7     8
test4     9     10

有没有什么方法可以定义一个函数,如果我调用它就会执行此操作?我不想在需要时将这段代码放入我的程序中。我已经尝试了一些东西,但我似乎无法做出正常工作的东西。

只需将已有的代码放入函数定义中,如下所示:

def print_dict(dict_):
    keys = list(dict_.keys())
    keys.sort()
    print("Col1      Col2  Col3")
    for x in range(5):
        check_1 = (dict_["test{0}".format(x)][0])
        check_2 = (dict_["test{0}".format(x)][1])
        print("test{0}".format(x), check_1, check_2, sep = '     ')

那么你可以这样使用它:

test = {
    "test0": [1, 2],
    "test1": [3, 4],
    "test2": [5, 6],
    "test3": [7, 8],
    "test4": [9, 10]
}

print_dict(test)

这是一个相当通用的变体:

def print_dict_of_lists(adict):
    # formatting the header: by far the hardest part!
    ncols = max(len(v) for v in adict.values())
    colw = max(len(str(c)) for v in adict.values() for c in v)
    khw = max(len(str(k)) for k in adict)
    print('{:{khw}} '.format('Col1', khw=khw), end='')
    for i in range(ncols):
        print('Col{:<{colw}} '.format(i+2, colw=colw-3), end='')
    print()
    # next, the easier task of actual printing:-)
    for k in sorted(adict):
        print('{:{khw}} '.format(k, khw=khw), end='')
        for c in adict[k]:
            print('{:<{colw}} '.format(c, colw=colw), end='')
        print()

根据适用于所有要打印的 dict 的约束,代码将需要简化或进一步复杂化。例如,此版本适用于任何值为列表的字典。如果您准确而严格地指定 what dicts 您希望能够以这种方式打印,则代码(如果需要)可以相应地更改。