在格子中输出
【问题】给定多个串的列表,每个串含多个项,用逗号分开。
把这些项输出到表格中,居中对齐。
例如,串表如下:
a,bb,ccc
aaaa,,ccccc
a,b,c,ddd
aa,,ccccccccccccccccc,,ee
则输出的效果如下:
+----+--+-----------------+---+--+
| a |bb| ccc | | |
+----+--+-----------------+---+--+
|aaaa| | ccccc | | |
+----+--+-----------------+---+--+
| a |b | c |ddd| |
+----+--+-----------------+---+--+
| aa | |ccccccccccccccccc| |ee|
+----+--+-----------------+---+--+
分析:
首先,可以把串中的多个项变成关于串的列表。
然后,统计表格每个列中串的最大宽度,作为表格的列宽。
如果用字典记录这些信息,可以用列号作键,用最大宽度作值。
当需要输出表格的时候,对每行,输出分割线,接着输出表格内容,最后再补一个分割线。
项数不足的行,需要补充一些空串在尾部。
### 在格子内输出
def show_grid(ss):
t = [ s.strip().split(',') for s in ss ]
w = {} ## 存每一列的最大宽度, 形如:{1:15,2:10...}
for ti in t:
for i,s in enumerate(ti):
v = w.get(i,0)
w[i] = max(v,len(s))
def show_line():
for i in sorted(w.keys()):
print('+' + '-' * w[i], end='')
print('+')
for ti in t:
show_line()
while len(ti)<len(w): ti.append("")
for i,s in enumerate(ti):
print('|' + s.center(w[i]), end='')
print('|')
show_line()
if __name__ == '__main__':
x = ['a,bb,ccc', \
'aaaa,,ccccc', \
'a,b,c,ddd', \
'aa,,ccccccccccccccccc,,ee']
show_grid(x)
取出字典的键的时候,要请注意,它可能不是按照期望的顺序,需要先排序一下。
这个应用中,键是整数,而且中间没有间断,也可以用列表来完成。
用字典的时候,如果使用 defaultdict 可能表述会更紧凑一些。
需要补基础的,可以看:小甲鱼pyhthon教程,Bilibili站上还有:[耿老师]小甲鱼python作业 解析系列,持续更新中。