动态构建字符串'string'.format()

时间:2014-01-17 12:00:20

标签: python string python-2.7

我正在尝试编写一个打印各种尺寸表的函数。可能不是我做的最好的尝试,但几乎就在那里。

最后一块拼图是用可变数量的输入线创建字符串。由于.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)

1 个答案:

答案 0 :(得分:2)

您有多种选择:

  1. 格式化列表的每个元素,然后使用str.join()将这些元素合并为更长的字符串:

    ''.join(['{0:{1}}'.format(c, width + extra) for c, width in zip(line, maxLength)])
    
  2. 构建动态格式字符串(连接各种{}部分),然后使用*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)
    
  3. 稍微简化您的代码:

    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)])
    
相关问题