【问题标题】:print python list with width specifiers使用宽度说明符打印 python 列表
【发布时间】:2013-03-03 16:31:16
【问题描述】:

我希望有更好的方法来做到这一点。直接上代码:

print "-I- %-6s%-6s%-6s%-6s%-6s%-6s%-6s%-6s%-8s" % \
      ("A",B","C","D","E","F","G","H","% Done")
print "-I- %-6s%-6s%-6s%-6s%-6s%-6s%-6s%-6s%-8s" % \
      ("-"*5 ,"-"*5 ,"-"*5 ,"-"*5 ,"-"*5 ,"-"*5 ,"-"*5,"-"*5,"-"*8)

理想情况下,我想做这样的事情:

hdrs = ["A",B","C","D","E","F","G","H","% Done"]
<print statement that uses len(hdrs[i]+2) for the column width>
<print statement that uses len(hdrs[i]+2) for the column width and len(hdrs[i]+1 for the number of dashes>

输出如下所示:

A     B     C
----- ----- -----

这种方法比我目前的方法可扩展得多。我已经使用 join 和 map 尝试了各种方法,但我还没有找到可行的解决方案。任何帮助将不胜感激。

编辑:

我刚刚完成了这部分工作:

print " ".join("-"*(len(x)+1) for x in hdrs)

前一行代码按照我在原始帖子中要求的方式打印破折号,但我想知道是否有更清洁的方式。我仍然不知道如何打印字符串。

【问题讨论】:

    标签: python list printing format


    【解决方案1】:

    如果您只是想完成它而不是将其作为练习,请使用prettytable。此示例来自链接教程:

    x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"])
    x.align["City name"] = "l" # Left align city names
    x.padding_width = 1 # One space between column edges and contents (default)
    x.add_row(["Adelaide",1295, 1158259, 600.5])
    x.add_row(["Brisbane",5905, 1857594, 1146.4])
    x.add_row(["Darwin", 112, 120900, 1714.7])
    x.add_row(["Hobart", 1357, 205556, 619.5])
    x.add_row(["Sydney", 2058, 4336374, 1214.8])
    x.add_row(["Melbourne", 1566, 3806092, 646.9])
    x.add_row(["Perth", 5386, 1554769, 869.4])
    print x
    

    输出:

    +-----------+------+------------+-----------------+
    | City name | Area | Population | Annual Rainfall |
    +-----------+------+------------+-----------------+
    | Adelaide  | 1295 |  1158259   |      600.5      |
    | Brisbane  | 5905 |  1857594   |      1146.4     |
    | Darwin    | 112  |   120900   |      1714.7     |
    | Hobart    | 1357 |   205556   |      619.5      |
    | Sydney    | 2058 |  4336374   |      1214.8     |
    | Melbourne | 1566 |  3806092   |      646.9      |
    | Perth     | 5386 |  1554769   |      869.4      |
    +-----------+------+------------+-----------------+
    

    【讨论】:

      【解决方案2】:

      这个怎么样:

      hdrs = ("A","B","C","D","E","F","G","H","% Done")
      fmt_string = ''.join("%%-%is" % (len(h)+2) for h in hdrs)
      print(fmt_string % hdrs)
      print(fmt_string % tuple("-"*(len(h)+1) for h in hdrs))
      

      我使用了描述的列大小而不是示例中的列大小。

      【讨论】:

        【解决方案3】:

        你可以像这样构造你的格式字符串:

        format = "".join(["%-"+str(len(h)+2)+"s" for h in hdrs])
        

        然后用它来打印你的列表,例如:

        l = range(hdrs) # example data to print, the number of items is the same as hdrs
        print format % tuple(l)
        

        【讨论】:

          【解决方案4】:

          试试这个,这里可以指定每列的宽度(不要让字符串大于宽度)

          widths = [6,6,6,6,6,6,6,6,8]
          hdrs = ["A","B","C","D","E","F","G","H","% Done"]
          
          data = [hdrs[i].ljust(widths[i]) for i in range(len(hdrs))]
          widths = ['-'*i for i in widths]
          
          print '%s '*len(data) % tuple(data)
          print ' '.join(widths)
          

          输出

          A      B      C      D      E      F      G      H      % Done 
          ------ ------ ------ ------ ------ ------ ------ ------ --------
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-13
            • 1970-01-01
            • 2018-10-08
            • 2015-12-31
            • 1970-01-01
            • 2015-12-30
            • 2012-06-01
            相关资源
            最近更新 更多