python print 语句中带有标签的字典中字符串的一致格式

consistent formatting of strings from a dictionary with labels in a python print statement

我有一本看起来像这样的字典:

d = {
    'last_price': '760.54',
    'change': 'N/A',
    'days_range': '760.00 - 775.00',
    'previous_close': '771.23',
    'change_percent': '-1.39%', 
}

本词典中的所有值都可能发生变化。这些数字可以有很大的不同,从一位数到几位长。我想格式化此信息并始终如一地呈现它:

Last:            0.54         Change:         N/A (-1.39%)
Prev Close:      1.23         Day's Range:    0.00 - 5.00

到目前为止,我一直在尝试这样做:

print "\
Last: {last_price:>17} \t Change: {change:>11} ({change_percent}) \n\
Prev Close: {previous_close:>11} \t Day's Range: {days_range:>18}\
".format(**d)

这会产生如下所示的输出:

Last:            760.54          Change:         N/A (-1.39%)
Prev Close:      771.23          Day's Range:    760.00 - 775.00

如果数字不变,这就足够了,但如果 "days_range" 设置为“78.91 - 79.91”之类的值,它将进一步向右跳转。例如:

Last:             79.21          Change:         N/A (-1.19%)
Prev Close:       80.16          Day's Range:      78.91 - 79.91

我也不能说我很满意使用“\t”来分隔列,因为我担心如果第一列中的值太长,这会导致正确的列得到比预期更靠右。

有没有一种简单而优雅的方法来做到这一点?我更喜欢不依赖于非标准库并且相对简单的解决方案。

我还想知道一种无需修改字典中的值即可在值前加上美元符号的简单方法。

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

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)

关于您关于在美元符号前添加的第二个问题,除了 "Day's Range" 之外的所有内容都应该很简单。对于 "Day's Range" 我想不出比在前面加一个然后将字符串向下拆分 ' - ' 然后在后半部分加一个更简单的方法。

在 Python 3 和更新的版本中,您可以通过 str.format() 作为:

print('{:<15} {:<15} {:<15} {:<15}'.format('Last:', d['last_price'], 'Change:', '{} ({})'.format(d['change'], d['change_percent'])))
#         ^ Note this

打印:

 Last:           760.54          Change:         N/A (-1.39%)

此处,<表示您希望内容从您提到的光标位置左对齐,其中>表示右对齐。

这是您同时打印的数据结果:

>>> '{:<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 作为:

'%-15s %-15s %-15s %-15s' % ('Change: ', d['last_price'], 'Change:', '{} ({})'.format(d['change'], d['change_percent']))
#       ^  '-'ive value means align left

打印:

'Change:         760.54          Change:         N/A (-1.39%)   '