【问题标题】:How to set a variable space with right alignment for a string in Python?如何在 Python 中为字符串设置右对齐的变量空间?
【发布时间】:2020-06-12 08:29:29
【问题描述】:

我正在尝试执行这个程序,其中给定一个数字 N,必须打印出 1 到 N 范围内所有数字的十进制、八进制、十六进制和二进制。问题是平台需要解决方案特定格式。

假设数字是 17,那么输出应该是这样的:

    1     1     1     1
    2     2     2    10
    3     3     3    11
    4     4     4   100
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8    10     8  1000
    9    11     9  1001
   10    12     A  1010
   11    13     B  1011
   12    14     C  1100
   13    15     D  1101
   14    16     E  1110
   15    17     F  1111
   16    20    10 10000
   17    21    11 10001

对于 7,它会像:

    1     1     1   1
    2     2     2  10
    3     3     3  11
    4     4     4 100
    5     5     5 101
    6     6     6 110
    7     7     7 111

如果您注意到,以上内容需要以十进制、八进制和十六进制数的左侧至少需要 2 个空格的方式打印,而二进制数的左侧至少需要一个空格。现在,随着数字长度的增加,需要相应地给出空间,以便即使对于最大长度的数字也存在最小空间。那么,如何使用可变空间打印它们?到目前为止,我已经尝试过:

代码

def print_formatted(number):
    space=len(str(bin(number))[2:])
    for i in range(1,number+1):
        print('{:2d}'.format(i), end='')
        print('{:>3s}'.format(str(oct(i))[2:]), end='')
        print('{:>3s}'.format(str(hex(i))[2:]), end='')
        print('{:>'+str(space)+'s}'.format(str(bin(i))[2:]))

print_formatted(17)

在这里,我只是尝试只使用二进制数执行所需的操作,但它给了我一个错误

    print('{:>'+str(space)+'s}'.format(str(bin(i))[2:]))
ValueError: Single '}' encountered in format string

有什么解决方法/替代方法吗?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您的问题是运算符顺序 - 用于字符串连接的 + 弱于方法调用

    '{:>' + str(space) + 's}'.format(str(bin(i))[2:])
    

    。这就是为什么你只在"s}" 上调用.format(...) - 而不是整个字符串。这就是

    ValueError: Single '}' 在格式字符串中遇到

    来自。

    在应用 .format 之前将完整的格式字符串放在括号中可以解决此问题。

    您还需要 1 个二进制空间,并且可以跳过一些不需要的 str()

    def print_formatted(number):
        space=len(str(bin(number))[2:])+1     # fix here
        for i in range(1,number+1):
            print('{:2d}'.format(i), end='')
            print('{:>3s}'.format(oct(i)[2:]), end='')
            print('{:>3s}'.format(hex(i)[2:]), end='')
            print(('{:>'+str(space)+'s}').format(bin(i)[2:])) # fix here
    
    print_formatted(17)
    

    输出:

     1  1  1     1
     2  2  2    10
     3  3  3    11
     4  4  4   100
     5  5  5   101
     6  6  6   110
     7  7  7   111
     8 10  8  1000
     9 11  9  1001
    10 12  a  1010
    11 13  b  1011
    12 14  c  1100
    13 15  d  1101
    14 16  e  1110
    15 17  f  1111
    16 20 10 10000
    17 21 11 10001
    

    从上面给定的输出中,您可能需要在前面加上 2 个空格 - 不确定它是上面输出中的格式错误还是部分限制。


    您也可以通过使用 f 字符串来缩短它(并删除 bin, oct, hex 周围的多余 str():它们都已经返回一个字符串)。

    然后你需要计算你使用的数字你的空间你的输入值:

    def print_formatted(number):
        de,bi,oc,he = len(str(number)), len(bin(number)), len(oct(number)), len(hex(number))
    
        for i in range(1,number+1):
            print(f'  {i:{de}d}{oct(i)[2:]:>{oc}s}{hex(i)[2:]:>{he}s}{bin(i)[2:]:>{bi}s}')
    
    print_formatted(26)
    

    容纳 17 之后的其他值,f.e. 128:

        1    1   1         1
        2    2   2        10
        3    3   3        11
    ...
        8   10   8      1000
    ...
       16   20  10     10000
    ...
       32   40  20    100000
    ...
       64  100  40   1000000
    ...
      128  200  80  10000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多