基于最大长度格式化字符串

4
longest = len(max(l))
for col1, col2, col3 in zip(l[::3],l[1::3],l[2::3]):
    print('{:^20}|{:^20}|{:^20}'.format(col1,col2,col3))

如何使用longest替代20,以使格式始终适合?如果可能的话,使用格式或其他方式,使我的代码看起来不那么丑陋。

4个回答

5
您可以直接以以下格式传递宽度:
for cols in zip(l[::3],l[1::3],l[2::3]):
    print('{:^{width}}|{:^{width}}|{:^{width}}'.format(*cols,width=longest))

(改编自文档中引用的示例)

您无需手动拆开列。只需在format调用中使用*即可解包它们。


3

格式可以嵌套:

longest = len(max(l))
for col1, col2, col3 in zip(l[::3],l[1::3],l[2::3]):
    print('{:^{len}}|{:^{len}}|{:^{len}}'.format(col1,col2,col3, len=longest))

正是我想要的! - lol
请注意,我几分钟前已经回答了这个问题。 - Jean-François Fabre

1

尝试:

(str(longest).join(['{:^','}|{:^','}|{:^','}']).format(col1,col2,col3))

1
我喜欢这个答案,它非常有创意,但不是我想要的。 - lol

1
longest = len(max(l))

# tpl will be '{:^20}|{:^20}|{:^20}'
tpl = '{{:^{longest}}}|{{:^{longest}}}|{{:^{longest}}}'.format(longest=longest)
for col1, col2, col3 in zip(l[::3],l[1::3],l[2::3]):
    print(tpl.format(col1,col2,col3))

你可以先创建模板,然后再插入列。
如果你想在输出中保留大括号,可以使用双花括号。
>>> "{{ {num} }}".format(num=10)
'{ 10 }'

你的答案没有被选中,因为不需要3个花括号来完成这个任务。 - lol
当然不是!我没有阅读文档,只是随意尝试了一下。被接受的答案中的方法是最好的,并且也有文档记录。 - AKS
@Jean-FrançoisFabre:看起来你的答案现在被接受了。可能是因为有太多的答案流入,导致OP之前没有看到它。那么,我的关于被接受的答案的评论仍然有效;-) - AKS

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