首页 > 解决方案 > 如何每行漂亮地打印多个字典条目?

问题描述

我有一本包含许多条目的字典:

d = dict([(i, 'Data') for i in range(100)])

如果我尝试漂亮地打印这些数据

pp = PrettyPrinter(indent=4, width=999)
pp.pprint(d)

它每行只打印一个条目:

{   0: 'Data',
    1: 'Data',
    ...
    99: 'Data'}

但是,我希望它每行打印尽可能多的条目,因为它可以适合width的限制。

像这样的东西:

{   0: 'Data', 1: 'Data', 2: 'Data',
    3: 'Data', 4: 'Data', 5: 'Data',
    ...
    99: 'Data'}

如何使用已经存在的包实现此结果?

标签: pythondictionaryprintingpretty-print

解决方案


这并不能真正回答问题,因为它不使用漂亮的打印或其他现有库。它也不考虑边缘情况,例如键或值中的新行,或嵌套/非字符串类型。

d = dict([(i, 'Data') for i in range(20)])


def print_dict(d, col_width=80, sep=','):
    if not len(d):
        print('{}')
        return
    def get_str(k, v):
        return '%s: %s' % (k, v)


    print('{', end='')
    items = iter(d.items())
    
    entry = get_str(*next(items))
    used_width = len(entry)
    print(entry, end='')

    for k, v in items:
        entry = get_str(k, v)
        
        # if the current entry's string rep will cause an overflow, and the current line
        # isn't blank, then go to the next line
        new_line = used_width + len(entry) > col_width and used_width > 0
        if new_line:
            print(f'{sep}\n', end='')
            used_width = 0
        
        print((f'{sep} ' if not new_line else '') + get_str(k, v), end='')
        used_width += len(entry)

    print('}')

print_dict(d)

它只是将尽可能多的项目放在一行中而不会溢出,但在每一行中至少放置一个项目。

{0: Data, 1: Data, 2: Data, 3: Data, 4: Data, 5: Data, 6: Data, 7: Data, 8: Data, 9: Data, 10: Data,
11: Data, 12: Data, 13: Data, 14: Data, 15: Data, 16: Data, 17: Data, 18: Data, 19: Data}

推荐阅读