consistent formatting of strings from a dictionary with labels in a python print statement
本问题已经有最佳答案,请猛点这里访问。
我有一本像这样的字典:
1 2 3 4 5 6 7 | d = { 'last_price': '760.54', 'change': 'N/A', 'days_range': '760.00 - 775.00', 'previous_close': '771.23', 'change_percent': '-1.39%', } |
本字典中的所有值都可能更改。数字的长度可以从一个数字到几个数字不等。我希望将此信息格式化,并按如下方式持续呈现:
1 2 | Last: $760.54 Change: N/A (-1.39%) Prev Close: $771.23 Day's Range: $760.00 - $775.00 |
到目前为止,我一直在努力做到这一点:
1 2 3 4 5 | print"\ Last: {last_price:>17} \t Change: {change:>11} ({change_percent}) \ Prev Close: {previous_close:>11} \t Day's Range: {days_range:>18}\ ".format(**d) |
这将产生如下输出:
1 2 | Last: 760.54 Change: N/A (-1.39%) Prev Close: 771.23 Day's Range: 760.00 - 775.00 |
如果数字不变,这就足够好了,如果"天范围"设置为"78.91-79.91"这样的值,它会跳到右边。例如:
1 2 | Last: 79.21 Change: N/A (-1.19%) Prev Close: 80.16 Day's Range: 78.91 - 79.91 |
我也不能说我很满足于使用" "来分隔列,因为我担心如果第一列中的值太长,这会导致右列被推到比预期更右的位置。
有没有一种简单而优雅的方法来做到这一点?我更喜欢一个不依赖于非标准库且相对简单的解决方案。
我还想知道一个简单的方法,不需要修改字典中的值,就可以用美元符号提前计算值。
在python 3和更新版本中,您可以通过
1 2 | print('{:<15} {:<15} {:<15} {:<15}'.format('Last:', d['last_price'], 'Change:', '{} ({})'.format(d['change'], d['change_percent']))) # ^ Note this |
哪些印刷品:
1 | Last: 760.54 Change: N/A (-1.39%) |
这里,
以下是同时打印时所打印数据的结果:
1 2 3 4 | >>> '{:<15} {:<15} {:<15} {:<15}'.format('Prev Close:', 771.23, 'Day\'s Range:', '760.00 - 775.00') "Prev Close: 771.23 Day's Range: 760.00 - 775.00" >>> '{:<15} {:<15} {:<15} {:<15}'.format('Prev Close:', 80.16, 'Day\'s Range:', '78.91 - 79.91') "Prev Close: 80.16 Day's Range: 78.91 - 79.91 " |
所有的门都是左对齐的。
注意:上面的sysntax用于字符串格式,仅在python 3和更新版本中可用。在旧版本中,您必须使用
1 2 | '%-15s %-15s %-15s %-15s' % ('Change: ', d['last_price'], 'Change:', '{} ({})'.format(d['change'], d['change_percent'])) # ^ '-'ive value means align left |
哪些印刷品:
1 | 'Change: 760.54 Change: N/A (-1.39%) ' |
您可以将其更改为左对齐,这对我很有用(我使用了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def print_data(d,spaces): print('Last:'.ljust(spaces) + d['last_price'].ljust(spaces) + \ 'Change:'.ljust(spaces) + d['change'] + ' (' + d['change_percent'] + ')') print('Prev close:'.ljust(spaces) + d['previous_close'].ljust(spaces) + "Day's Range:".ljust(spaces) + d['days_range']) data = { 'last_price': '760.54', 'change': 'N/A', 'days_range': '760.00 - 775.00', 'previous_close': '771.23', 'change_percent': '-1.39%', } print_data(data,15) print() data['days_range'] = '78.91 - 79.91' print_data(data,15) |
至于你第二个关于提前准备美元符号的问题,除了"一天的范围"以外,一切都应该是容易的。对于"一天的范围",我想不出一个比在前面加一个,然后把绳子从