【问题标题】:How to right-align numeric data?如何右对齐数字数据?
【发布时间】:2010-11-26 23:40:53
【问题描述】:

我有一些数据以 3 列格式显示,格式如下:

key: value key: <tab> key: value <tab> key: value

这是一个例子:

p: 1    sl: 10  afy: 4
q: 12   lg: 10  kla: 3
r: 0    kl: 10  klw: 3
s: 67   vw: 9   jes: 3
t: 16   uw: 9   skw: 3
u: 47   ug: 9   mjl: 3
v: 37   mj: 8   lza: 3
w: 119  fv: 8   fxg: 3
x: 16   fl: 8   aew: 3

但是,我希望数字是否完全对齐,例如:

a:   1
b:  12
c: 123

如何在 Python 中做到这一点?

这是我现有的打印代码:

print(str(chr(i+ord('a'))) + ": " + str(singleArray[i]) + "\t" +
    str(doubleArray[i][0]) + ": " + str(doubleArray[i][1]) + "\t" +
    str(tripleArray[i][0]) + ": " + str(tripleArray[i][1]))

【问题讨论】:

    标签: python string text formatting


    【解决方案1】:

    在 Python 2.5 中使用 rjust(在字符串上)。此外,尝试习惯使用 python 中的string formatting,而不仅仅是连接字符串。下面是 rjust 和字符串格式的简单示例:

    width = 10
    str_number = str(ord('a'))
    print 'a%s' % (str_number.rjust(width))
    

    【讨论】:

      【解决方案2】:

      如果您知道数字的上限,则可以使用"%<lenght>d" % n 进行格式化。鉴于所有这些计算都已完成并在 (char, num) 的列表中:

      mapping = ((chr(i+ord('a')), singleArray[i]), 
                 (doubleArray[i][0],doubleArray[i][1]), 
                 (tripleArray[i][0],tripleArray[i][1])
                 )
      for row in mapping:
         print "%s: %3d" % row
      

      【讨论】:

        【解决方案3】:

        使用 python 字符串格式:'%widths' 其中宽度是整数

        >>> '%10s' % 10
        '        10'
        >>> '%10s' % 100000
        '    100000'
        

        【讨论】:

        • 对于左对齐使用 '%-10s' (只是添加这个,因为它是左对齐的顶部 Google 结果)
        【解决方案4】:

        在 python 2.6+(它是 3 中的标准方法)中,字符串格式化的“首选”方法是使用 string.format()(可以找到完整的文档here)。 正确的理由可以用

        "a string {0:>5}".format(foo)
        

        这将使用 5 个位置,但是

        "a string {0:>{1}}".format(foo, width)
        

        也是有效的,并将使用传递给 .format() 的值宽度。

        【讨论】:

        • 我不知道为什么这个答案被投票,因为它不正确 - 对于右对齐/对齐,必须使用 "{:>5}" 其中> 表示右对齐(默认对于字符串是<,或左对齐)。幸运的是,链接到的文档清楚地说明了这一点。 (编辑:没关系,我会修复答案并将其留作参考。)
        • 它已被投票,因为">" 是数字“对齐”字段的默认值,而问题是关于数字的。不过,您是对的,将其明确化会更好。
        • 过失。我发现这个问题是因为我试图右对齐字符串,并且我没有仔细阅读 OP 问题以发现只有数字被打印。感谢您的澄清。
        【解决方案5】:

        在 Python 3.6 中你可以使用Literal String Interpolation,它更少 冗长且使用起来可能更直观:

        width = 5
        number = 123
        print (f'{number:>{width}}')
        

        或者只是:

        number = 123
        print (f'{number:>5}')
        

        它重用了大部分 str.format() 语法。

        我猜/希望这将是未来的首选方式。

        猜你喜欢
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 2011-10-09
        • 2013-09-30
        • 1970-01-01
        • 2020-11-20
        • 2013-01-28
        相关资源
        最近更新 更多