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

时间:2016-11-19 03:11:45

标签: python printing string-formatting

我有一个字典,看起来像这样:

Last:            $760.54         Change:         N/A (-1.39%)
Prev Close:      $771.23         Day's Range:    $760.00 - $775.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

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

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

如果这些数字没有改变,那么这种方法运作得很好,如果" days_range"设置为" 78.91 - 79.91"它会进一步跳到右边。例如:

{{1}}

我也不能说我对使用" \ t"非常满意。分离列,因为我担心如果第一列中的值太长,这可能导致右列被推得比正确的更远。

有一种简单而优雅的方法吗?我更喜欢不依赖于非标准库的解决方案,而且相对简单。

我也想知道一种简单的方法,可以在美元符号前面添加值,而无需修改字典中的值。

2 个答案:

答案 0 :(得分:2)

在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  "

所有的coulmns都保持对齐。

注意:字符串格式化的上述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%)   '

答案 1 :(得分:1)

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

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)

至于你关于预先设置美元符号的第二个问题,除了&#34; Day&#39;范围&#34;应该很容易。对于&#34; Day&#34;范围&#34;我不能想到一种比在前面添加一个并将字符串向下分割' - '并在后半部分添加一个更简单的方法。