【问题标题】:python print in format way unknown list lengthpython以格式方式打印未知列表长度
【发布时间】:2013-06-03 18:06:27
【问题描述】:

如果我有一个这样的 6 长列表:

l = ["AA","BB","CC","DD"]

我可以打印它:

print "%-2s %-2s %-2s %-2s" % tuple(l)

输出将是:

AA BB CC DD

但是如果列表 l 可以是任意长度呢?有没有办法用未知数量的元素以相同的格式打印列表?

【问题讨论】:

    标签: python list printing format


    【解决方案1】:

    生成单独的 sn-ps 并加入它们:

    print ' '.join(['%-2s' % (i,) for i in l])
    

    或者你可以使用字符串乘法:

    print ('%-2s ' * len(l))[:-1] % tuple(l)
    

    [:-1] 去掉末尾多余的空格;你也可以使用.rstrip()

    演示:

    >>> print ' '.join(['%-2s' % (i,) for i in l])
    AA BB CC DD
    >>> print ' '.join(['%-2s' % (i,) for i in (l + l)])
    AA BB CC DD AA BB CC DD
    >>> print ('%-2s ' * len(l))[:-1] % tuple(l)
    AA BB CC DD
    >>> print ('%-2s ' * len(l))[:-1] % tuple(l + l)
    AA BB CC DD AA BB CC DD
    

    时间统计:

    >>> def joined_snippets(l):
    ...     ' '.join(['%-2s' % (i,) for i in l])
    ... 
    >>> def joined_template(l):
    ...     ' '.join(['%-2s' for i in l])%tuple(l)
    ... 
    >>> def multiplied_template(l):
    ...     ('%-2s ' * len(l))[:-1] % tuple(l)
    ... 
    >>> from timeit import timeit
    >>> l = ["AA","BB","CC","DD"]
    >>> timeit('f(l)', 'from __main__ import l, joined_snippets as f')
    1.3180170059204102
    >>> timeit('f(l)', 'from __main__ import l, joined_template as f')
    1.080280065536499
    >>> timeit('f(l)', 'from __main__ import l, multiplied_template as f')
    0.7333378791809082
    >>> l *= 10
    >>> timeit('f(l)', 'from __main__ import l, joined_snippets as f')
    10.041708946228027
    >>> timeit('f(l)', 'from __main__ import l, joined_template as f')
    5.52706503868103
    >>> timeit('f(l)', 'from __main__ import l, multiplied_template as f')
    2.8013129234313965
    

    倍增的模板选项将其他选项留在了尘埃中。

    【讨论】:

    • 我花了一点时间才明白为什么你的比我的快。这是列表理解产生生成器表达式的情况之一
    • 谢谢,有没有办法在不加入的情况下实现这一目标?类似print "%-2s ... %-2s" % tuple(l)。我以前用 join 做过,但我想知道是否有一些内置的支持。再次感谢
    • @user1692261,您可以使用'%-2s '*len(l)%tuple(l),但最后会留下额外的空间。不过,这对你来说可能并不重要
    • @user1692261:现在你有多个选项和时间信息来了解更快的方法。
    【解决方案2】:
    tests = [
        ["AA"],
        ["AA", "BB"],
        ["AA", "BBB", "CCC"]
    ]
    
    for test in tests:
        format_str = "%-2s " * len(test)
        print format_str
    
    --output:--
    %-2s 
    %-2s %-2s 
    %-2s %-2s %-2s 
    

    【讨论】:

    • 您的输出有一个尾随空格,这可能不是 OP 想要或期望的。
    • 太糟糕了 python 没有 rstrip() 函数。或字符串切片。 :(
    • 哈迪哈。或者你是认真的吗? docs.python.org/2/library/stdtypes.html#str.rstrip
    • 哈哈。我现在看到你比我提前 4 分钟发布了同样的内容。还是我发帖后你把它加到你的帖子里了??所以太混乱了。
    • 我确实在宽限期内编辑了一些东西,是的。我经常这样做;继续添加更多信息和细节。
    【解决方案3】:

    另一种方法

    ' '.join(['%-2s' for i in l])%tuple(l)
    

    我发现这比使用生成器表达式快两倍以上

    ' '.join('%-2s' for i in l)%tuple(l)
    

    这还是更快

    '%-2s '*len(l)%tuple(l) # leaves an extra trailing space though
    

    【讨论】:

      猜你喜欢
      • 2015-07-22
      • 1970-01-01
      • 2021-12-31
      • 2013-10-24
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2011-11-13
      • 2017-02-01
      相关资源
      最近更新 更多