【问题标题】:Tabs in print are not consistent python打印中的标签不一致python
【发布时间】:2022-04-10 20:02:48
【问题描述】:

我想在打印中使用真正的标签,但\t 只放置空格。 例如:

 first:ThisIsLong         second:Short
 first:Short         second:ThisIsLong
 first:ThisIsEvenLonger         second:Short

我将如何解决它,以便我可以将所有的第一和所有的秒都排好。例如:

 first:ThisIsLong         second:Short
 first:Short              second:ThisIsLong
 first:ThisIsEvenLonger   second:Short

【问题讨论】:

  • 对不起\t不是\n我是新来的,还在习惯堆栈溢出
  • 你展示的东西是你期望的真实标签的东西
  • 真正的标签卡到一个点
  • 但是——并不总是达到您期望的程度。看我的回答。

标签: python string


【解决方案1】:

您可以改为使用格式来对齐字符串。例如,您可以告诉 python 第一列应该是 20 个字符长,第二列应该是 10 个字符,左对齐。

例如:

string_one = 'first:ThisIsLong'
string_two = 'second:Short'

print( '{:<20s} {:<10s}'.format(string_one, string_two) )

将打印:

first:ThisIsLong     second:Short

这里的第一个格式化描述符({:&lt;20s})是:

'&lt;' 左对齐,20 至少 20 个字符,s 因为它是一个字符串

【讨论】:

  • 如果字符串 1 并不总是相同,我该怎么做
  • @ewan 如果您对最长的字符串有一个合理的估计,那么只需将该数字插入格式描述符{:&lt;100s} 否则您将不得不找出最大值。字符串长度并使用它
  • 提示:您可以格式化格式描述符以动态添加长度:'{:&lt;%ds}' % 100 将输出{:&lt;100s}
【解决方案2】:

我建议不要使用制表符 (\t),而是使用 printf-style formatting 或 str.format 的字符串格式:

rows = [
    ['first:ThisIsLong', 'second:Short'],
    ['first:Short', 'second:ThisIsLong'],
    ['first:ThisIsEvenLonger', 'second:Short'],
]
for first, second in rows:
    print('%-25s %s' % (first, second))

或

print('{:<25} {}'.format(first, second))

【讨论】:

    【解决方案3】:

    计算每列所需的最大宽度,然后使用字符串格式化来组成指定所需宽度的格式:

    data = [['first:ThisIsLong', 'second:Short'],
            ['first:Short', 'second:ThisIsLong'],
            ['first:ThisIsEvenLonger', 'second:Short']]
    
    widths = [max([len(item) for item in col]) for col in zip(*data)]
    fmt = ''.join(['{{:{}}}'.format(width+4) for width in widths])
    for row in data:
        print(fmt.format(*row))
    

    产量

    first:ThisIsLong          second:Short         
    first:Short               second:ThisIsLong    
    first:ThisIsEvenLonger    second:Short         
    

    【讨论】:

      【解决方案4】:

      Python print 函数将字符串发送到标准输出。标准输出对这些字符串的作用取决于输出设备。 \t 的默认解释是前进到下一个tab stop,按照约定是字符位置,即\t 出现位置之后的下一个8 的倍数(从0 开始从左边开始计数字符位置) )。

      例如,如果我运行:

      babynames = [('kangaroo', 'joey'), ('fox', 'kit'), ('goose','gosling')]
      for x,y in babynames: print(x + '\t' + y)
      

      我明白了:

      kangaroo        joey
      fox     kit
      goose   gosling
      

      我在 IDLE 中得到了上述内容。 kangaroo 占据第 0-7 列。 \t 在第 8 列中,因此下一个 8 的倍数(下一个制表位)在标签位于第 16 列 - 这确实是您看到 joey 的位置。在接下来的两行中——第一个单词之后的下一个制表位在第 8 列中。这表明(至少在 IDLE shell 中)Python 是使用真正的制表符。

      这个意义上的标签有点烦人。它们只能用于对齐可变长度的字符串数据,具有一定的烦人难度。正如其他人所指出的那样,解决方案是不使用标签,而是使用format

      【讨论】:

      • 我刚刚测试了一下,\t对我来说只加了8个空格
      • 真的很抱歉,它确实有效,但我使用它的目的是什么
      • @ewan 一些 IDE 有一个选项可以自动将制表符转换为空格,这可能是默认启用的。这可能就是您所看到的。不同的编辑器/shell 处理 \t 的方式不同。它实际上与 Python 本身几乎没有关系。查看您正在使用的任何编辑器选项。
      【解决方案5】:

      最 Pythonic 的方式:

      string_one = 'first:ThisIsLong'
      string_two = 'second:Short'
      
      print(f'{string_one:<20s} {string_two:<10s}')
      

      您可以改为使用 F 字符串(格式字符串)来对齐字符串。例如,您可以告诉 python 第一列应该是 20 个字符长,第二列应该是 10 个字符,左对齐。

      使用这个 F 字符串将打印:

      first:ThisIsLong     second:Short
      

      说明

      在示例中: f'{insert_variable_here:&lt;20s}'

      :&lt;20s 是格式。

      : 表示在此之前取所有并格式化如下:

      &lt; 左对齐,20 至少留 20 个字符空格,s 因为它是一个字符串。

      感谢 mjwunderlich 提供答案格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 2019-08-26
        • 2023-04-05
        相关资源
        最近更新 更多