我正在尝试编写一个打印各种尺寸表的函数。可能不是我做的最好的尝试,但几乎就在那里。
最后一块拼图是用可变数量的输入线创建字符串。由于.format()
想要输入表单.format(s1, s2, s3)
并且没有列出.format( (line) )
中的列表,因此我无法为可变数量的列进行此操作。有没有办法在没有像eval
这样的强力尝试的情况下(在2.7中)这样做?我总是喜欢在虚空时不使用它们。
def print_table(self, lines, sum_columns = [], extra_width = 5):
maxLength = [0] * len(lines)
for line in lines:
maxLength = [max(l1,l2) for l1, l2 in zip(maxLength, [len(str(l)) for l in line])]
if sum_columns:
total = [0] * len(lines)
for line in lines:
for c in sum_columns:
total[c-1] += line[c-1]
string = ''
for c in xrange(len(maxLength)): string = string + '{%s:%s} ' %(c, maxLength[c] + extra_width)
string = string[:-1]
print string
for line in lines:
print string.format(XXXXXXXXX)
答案 0 :(得分:2)
您有多种选择:
格式化列表的每个元素,然后使用str.join()
将这些元素合并为更长的字符串:
''.join(['{0:{1}}'.format(c, width + extra) for c, width in zip(line, maxLength)])
构建动态格式字符串(连接各种{}
部分),然后使用*args
splat语法将列表作为参数序列应用。
template = ''.join(['{%(i)s:{widths[%(i)s]}}' % {'i': i} for i in range(len(maxLength))])
for line in lines:
print template(*line, widths=maxLength)
稍微简化您的代码:
def print_table(self, lines, sum_columns=None, extra_width=5):
columns = zip(*lines)
widths = [max(len(str(l)) for l in column) for column in columns]
for line in lines:
print ''.join(['{0:{1}}'.format(c, w + extra_width) for c, w in zip(line, widths)])
if sum_columns is not None:
totals = [sum(columns[i]) if i + 1 in sum_columns else 0 for i in range(len(columns))]
print ''.join(['{0:{1}}'.format(c, w + extra_width) for c, w in zip(totals, widths)])