Python以表格格式美观地打印列表

0 投票
1 回答
631 浏览
提问于 2025-04-18 05:02

我在这里提到一个帖子,内容是关于如何将列表以表格的形式美观地打印出来,链接在这里:Pretty printing a list in a tabular format

mylist = [ ( (12, 47, 4, 574862, 58, 7856), 'AGGREGATE_VALUE1'),
           ( (2, 75, 757, 8233, 838, 47775272785), 'AGGREG2'),
           ( (4144, 78, 78965, 778, 78578, 2), 'AGGREGATE_VALUE3')]

header = ('Price1','Price2','reference','XYD','code','resp','AGGREG values')

longg = dict(zip((0,1,2,3,4,5,6),(len(str(x)) for x in header)))

for tu,x in mylist:
    longg.update(( i, max(longg[i],len(str(el))) ) for i,el in enumerate(tu))
    longg[6] = max(longg[6],len(str(x)))
fofo = ' | '.join('%%-%ss' % longg[i] for i in xrange(0,7))

print '\n'.join((fofo % header,
                 '-|-'.join( longg[i]*'-' for i in xrange(7)),
                 '\n'.join(fofo % (a,b,c,d,e,f,g) for (a,b,c,d,e,f),g in mylist)))

我想把这段代码 '\n'.join(fofo % (a,b,c,d,e,f,g) for (a,b,c,d,e,f),g in mylist))) 替换成一个动态的方式。

比如说,我可以用 range1 = ', '.join(map(chr, range(97, 97+7))) 这段代码来生成 a,b,c,d,e,f,g。

这样的话,这行代码就会变成 '\n'.join(fofo % (range1) for (a,b,c,d,e,f),g in mylist)))

但是这样做会出现一个错误:

TypeError: not enough arguments for format string

1 个回答

0

这个错误是因为你用的 range1 是一个字符串,而你其实是希望用变量。你可能可以试试用类似 eval 的方法?

所以你可以这样做:

    '\n'.join(fofo % eval(range1) for (a,b,c,d,e,f),g in mylist)

或者为了避免引用多个变量:

    '\n'.join(fofo % (tuple(x[0])+(x[1],)) for x in mylist)

每个 mylist 里的元素都是一个包含元组和字符串的元组,像这样 ((a,b..), "string")。所以如果你考虑 x 包含这样的数据,tuple(x[0]) 就是指第一个元组,而 (x[1],) 则是用来创建一个只有一个元素的元组,这个元素就是字符串。最后,tuple(x[0])+(x[1],) 会把所有元素合成一个元组,像这样:

    x = ((0, 1, 2), "a")
    tuple(x[0])+(x[1],)  #is equivalent to (0, 1, 2, "a")

这个方法可以用 ((0, 1, 2, 3, 4), "a"),或者里面的元组有任意数量的元素。

撰写回答