关于打印:使用python print语句中的标签对字典中的字符串进行一致的格式设置

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和更新版本中,您可以通过str.format()执行以下操作:

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和更新版本中可用。在旧版本中,您必须使用%s作为:

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%)   '

您可以将其更改为左对齐,这对我很有用(我使用了ljust(),但您使用格式化的方式也应该有效):

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)

至于你第二个关于提前准备美元符号的问题,除了"一天的范围"以外,一切都应该是容易的。对于"一天的范围",我想不出一个比在前面加一个,然后把绳子从' - '上拆下来,在下半场加一个更容易的方法。