代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

动态格式化字符串

  •  38
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    如果我想使格式化字符串动态可调,我将从

    print '%20s : %20s' % ("Python", "Very Good")
    

    width = 20
    print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good")
    

    然而,这里的字符串连接似乎很麻烦。还有其他简化方法吗?

    5 回复  |  直到 6 年前
        1
  •  28
  •   Frédéric Hamidi    14 年前

    可以从参数列表中获取填充值:

    print '%*s : %*s' % (20, "Python", 20, "Very Good")
    

    甚至可以动态插入填充值:

    width = 20
    args = ("Python", "Very Good")
    padded_args = zip([width] * len(args), args)
    # Flatten the padded argument list.
    print "%*s : %*s" % tuple([item for list in padded_args for item in list])
    
        2
  •  56
  •   Sede    8 年前

    您可以使用 str.format() 方法。

    >>> width = 20
    >>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width))
                  Python :            Very Good
    

    从python 3.6开始,您可以使用 f-string 这样做:

    In [579]: lang = 'Python'
    
    In [580]: adj = 'Very Good'
    
    In [581]: width = 20
    
    In [582]: f'{lang:>{width}}: {adj:>{width}}'
    Out[582]: '              Python:            Very Good'
    
        3
  •  6
  •   Ignacio Vazquez-Abrams    14 年前
    print '%*s : %*s' % (width, 'Python', width, 'Very Good')
    
        4
  •  2
  •   Karl Knechtel    14 年前

    如果您不想同时指定宽度,可以像以前那样提前准备一个格式字符串,但使用另一个替换。我们使用 %% 以转义字符串中的实际%符号。我们想以 %20s 在我们的格式字符串中,当宽度为20时,我们使用 %%%ds 并提供宽度变量以在其中进行替换。前两个%符号变为文本%,然后用变量替换%d。

    因此:

    format_template = '%%%ds : %%%ds'
    # later:
    width = 20
    formatter = format_template % (width, width)
    # even later:
    print formatter % ('Python', 'Very Good')
    
        5
  •  0
  •   Praveen Kulkarni    6 年前

    对于那些想用python 3.6+做同样事情的人, f-Strings 这就是解决方案。

    width = 20
    py, vg = "Python", "Very Good"
    print(f"{py:>{width}s} : {vg:>{width}s}")