【问题标题】:Python Output not Aligned Using Space and TabPython 输出未使用空格和制表符对齐
【发布时间】:2023-04-11 03:03:01
【问题描述】:

我的代码在这里:

days = int(input("How many days did you work? : "))
totalSalary = 0
print("Day", "\tDaily Salary", "\tTotal Salary")
for day in range(days):
    daily = 2**day
    totalSalary += daily
    print(day+1, "\t    ", daily, "\t\t    ", totalSalary)

当我输入 6 作为输入时,输出如下:

Day     Daily Salary    Total Salary
1            1               1
2            2               3
3            4               7
4            8               15
5            16                      31
6            32                      63

为什么最后两行没有对齐?

编辑:我忘了说我知道有更好的解决方案,比如使用格式,但我只是想了解为什么制表符和空格会出现问题。

Edit2:Jason Yang 回答中制表位的可视化让我很满意。

【问题讨论】:

    标签: python


    【解决方案1】:

    声明

        print(day+1, "\t    ", daily, "\t\t    ", totalSalary)
    

    每个'\t' 将在第 1、9、17、...、每个第 8 个字符处停止

    所以它看起来像这样

    1=------____=1=-........____=1
    2=------____=2=-........____=3
    3=------____=4=-........____=7
    4=------____=8=-........____=15
    5=------____=16=--------........=31
    6=------____=32=--------........=63
    12345678123456781234567812345678 <--- Tab stop before each 1
    

    这里

    • = 是 print 的每两个参数之间的分隔空间
    • - 是非最后一个 TAB 生成的空格
    • _ 是您在打印中指定的空间。
    • . 是最后一个 TAB 生成的空间。

    从这里你可以找到他们停在不同位置的不同之处。

    尝试在您的打印中添加选项sep='',或更改您添加的空格数。

        print(day+1, "\t    ", daily, "\t\t    ", totalSalary, sep='')
    

    那就好了。

    How many days did you work? : 6
    Day     Daily Salary    Total Salary
    1           1               1
    2           2               3
    3           4               7
    4           8               15
    5           16              31
    6           32              63
    

    【讨论】:

    • 这很有帮助。所以在前四行中,中间的制表符只打印了 1 个空格。但是在最后两行中,由于额外的数字,那个 1 空格消失了。所以中间的tab打印了整个8个空格!如果我错了,请纠正我。
    • 你说得对!
    【解决方案2】:

    当第 2 列具有两位数的值时,制表符和第 3 列的其余部分会移位。如果您希望正确对齐列值,则必须对值使用零填充。

    如果你的python版本是3+,如果你想要2位数的值,你可以调用print(f'{n:02}'),如果n的值为1,则打印01

    对于 2.7+ 版本的 python,您可以使用 format,就像 print('{:02d}'.format(n))

    【讨论】:

      【解决方案3】:

      tab 不仅仅是white spaces 的集合

      tab 之前的任何字符都会填充空格。

      >>> print("A\tZ")
      A       Z
      >>> print("AB\tZ")
      AB      Z
      >>> print("ABC\tZ")
      ABC     Z
      

      如果没有空格来填充标签,那么它将被移动

      >>> print("ABCDEFGH\tZ")
      ABCDEFGH        Z
      

      【讨论】:

      • 我从你的例子中理解了规则。但是在我的情况下,我无法找出制表符填充空格之前的哪些字符。可以举个例子吗?
      【解决方案4】:

      我想你的问题是由于对制表符是什么以及它的行为方式有误解:

      制表符应该前进到下一个制表位。从历史上看,制表位是每 8 个字符,尽管现在常用较小的值,并且大多数编辑器都可以配置。来源: How many spaces for tab character(\t)?

      试试这个看看:

      print('123456789')
      print('1\t1')
      print('12\t1')
      print('123\t1')
      

      【讨论】:

      • 我从你的例子中理解了规则。但是在我的情况下,我无法找出制表符填充空格之前的哪些字符。可以举个例子吗?
      【解决方案5】:

      我认为您在“ print(day+1, "\t ", daily, "\t\t ", totalSalary)" 中添加了太多空格。 当您删除制表符空格时,您不会遇到“未对齐”问题。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案6】:

      动态空间声明。由于数字的长度

      days = int(input("How many days did you work? : "))
      totalSalary = 0
      day_data = []
      for day in range(days):
         daily = 2**day
         totalSalary += daily
         day_data.append([day+1,daily,totalSalary])
         
      num_space = len(str(day_data[-1][-1]))+2
      f_space_len, s_space_len = 5+num_space, 9+num_space
      print(f"Day{num_space*' '}Daily Salary{num_space*' '}Total Salary")
      for i in day_data:
         day, daily, totalSalary = map(str, i)
         print(day, (f_space_len-len(day)+1)*' ', daily,(s_space_len-len(daily)+1)*' ', totalSalary)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        相关资源
        最近更新 更多