【问题标题】:consistent formatting of strings from a dictionary with labels in a python print statement [duplicate]python print语句中带有标签的字典中字符串的一致格式[重复]
【发布时间】:2017-04-02 23:58:37
【问题描述】:

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

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

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

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

虽然如果数字没有变化,这可以很好地工作,但如果“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”来分隔列,因为我担心如果第一列中的值太长,这可能会导致右列被推得更远比预期的要好。

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

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

【问题讨论】:

  • 它会跳到右边,因为它是一个较短的字符串,并且您正在右对齐它们。听起来您希望每个值在列中左对齐。

标签: python printing string-formatting


【解决方案1】:

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

这里,&lt; 表示您希望内容从您提到的光标位置左对齐,而 &gt; 表示右对齐。

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

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

【讨论】:

    【解决方案2】:

    您可以将其更改为向左对齐,它对我有用(我使用了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)
    

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

    【讨论】:

    • 谢谢。这是一个很好的解决方案。感谢您的帮助。
    • 没问题!祝股票好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2015-08-23
    • 2023-03-08
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多