用格式方式打印Python未知列表长度

5
如果我有一个长度为6的列表如下所示: l = ["AA","BB","CC","DD"]
我可以使用以下方式打印它: print "%-2s %-2s %-2s %-2s" % tuple(l)
输出将会是:
AA BB CC DD
但如果列表l的长度不确定,有没有一种方法以相同的格式打印列表,而不知道元素数量呢?
3个回答

11

生成单独的代码片段并将它们合并:

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

乘法模板选项使其他选项相形见绌。


我花了一会儿才意识到为什么你的比我的快。这是其中一种情况,列表推导式胜过生成器表达式。 - John La Rooy
谢谢,有没有不用join实现的方法?比如 print "%-2s ... %-2s" % tuple(l)。我之前用join做过,但我想知道是否有一些内置的支持。再次感谢。 - user1692261
@user1692261,你可以使用'%-2s '*len(l)%tuple(l),但是这会在末尾留下一个额外的空格。不过这对你可能没有影响。 - John La Rooy
@user1692261:现在你有多种选择和时间信息,可以知道哪种方法更快。 - Martijn Pieters

1
另一种方法。
' '.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

0
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 

你的输出有一个尾随空格,可能不是原帖作者想要或期望的。 - Martijn Pieters
太遗憾了,Python 没有 rstrip() 函数。或者字符串切片。:( - 7stud
1
哈哈哈,还是你说的真的?http://docs.python.org/2/library/stdtypes.html#str.rstrip - Martijn Pieters
哈哈,我现在看到你比我早四分钟发布了同样的内容。还是你是在我发布后添加的?Stack Overflow 太令人困惑了。 - 7stud
是的,我在宽限期内编辑了一些东西。我倾向于经常这样做;随着时间的推移添加更多信息和细节。 - Martijn Pieters
没问题,我也一样。我只是发帖是因为我没有看到任何使用字符串乘法的答案。 - 7stud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接