python中的动态字符串格式
我想按如下方式打印我的输出。虽然第一眼看上去很容易做到,但这里有一些问题。列的数量可以不同,可以是负数,也可以是不同数字的数字等 因此,我如何才能完美地做到这一点,使外部边界保持完整,而不考虑内部的各种因素 我知道我必须在python中使用字符串格式,但不知道如何使用。python中的动态字符串格式,python,string-formatting,Python,String Formatting,我想按如下方式打印我的输出。虽然第一眼看上去很容易做到,但这里有一些问题。列的数量可以不同,可以是负数,也可以是不同数字的数字等 因此,我如何才能完美地做到这一点,使外部边界保持完整,而不考虑内部的各种因素 我知道我必须在python中使用字符串格式,但不知道如何使用。 1.我应该使用什么逻辑来打印标题+--+? 如何根据内部元素的数量确定长度? 2.如何以固定宽度和对齐方式打印数字 +---------------------------+ | 3 4 -4 -8 -10 -
1.我应该使用什么逻辑来打印标题
+--+
?如何根据内部元素的数量确定长度?
2.如何以固定宽度和对齐方式打印数字
+---------------------------+
| 3 4 -4 -8 -10 -12 |
| 5 5 3 -3 -4 -44 |
| 34 -4 -34 -22 22 22 |
+---------------------------+
编辑
我想用字符串格式实现这一点,而不是借助模块。这就是我喜欢Python的地方——总有一些东西阻止你重新发明轮子 对于您的用例,它非常适合:
import prettytable
l = [
[3, 4, -4, -8, -10, -12],
[5, 5, 3, -3, -4, -44],
[34, -4, -34, -22, 22, 22]
]
table = prettytable.PrettyTable(header=False, vrules=prettytable.FRAME)
for row in l:
table.add_row(row)
print table
印刷品:
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
| 5 | 5 | 3 | -3 | -4 | -44 |
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
同时检查包装文件页的段落
也有,但它在调整桌子外观方面没有那么强大:
import texttable
l = [
[3, 4, -4, -8, -10, -12],
[5, 5, 3, -3, -4, -44],
[34, -4, -34, -22, 22, 22]
]
table = texttable.Texttable()
table.add_rows(l, header=False)
print table.draw()
印刷品:
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
| 5 | 5 | 3 | -3 | -4 | -44 |
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
另一个选项是引入一组预定义的表格格式,例如“网格”: 印刷品:
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
| 5 | 5 | 3 | -3 | -4 | -44 |
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
另请参见相关线程:
import prettytable
l = [
[3, 4, -4, -8, -10, -12],
[5, 5, 3, -3, -4, -44],
[34, -4, -34, -22, 22, 22]
]
table = prettytable.PrettyTable(header=False, vrules=prettytable.FRAME)
for row in l:
table.add_row(row)
print table
印刷品:
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
| 5 | 5 | 3 | -3 | -4 | -44 |
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
同时检查包装文件页的段落
也有,但它在调整桌子外观方面没有那么强大:
import texttable
l = [
[3, 4, -4, -8, -10, -12],
[5, 5, 3, -3, -4, -44],
[34, -4, -34, -22, 22, 22]
]
table = texttable.Texttable()
table.add_rows(l, header=False)
print table.draw()
印刷品:
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
| 5 | 5 | 3 | -3 | -4 | -44 |
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
另一个选项是引入一组预定义的表格格式,例如“网格”: 印刷品:
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
| 5 | 5 | 3 | -3 | -4 | -44 |
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
+----+----+-----+-----+-----+-----+
| 3 | 4 | -4 | -8 | -10 | -12 |
+----+----+-----+-----+-----+-----+
| 5 | 5 | 3 | -3 | -4 | -44 |
+----+----+-----+-----+-----+-----+
| 34 | -4 | -34 | -22 | 22 | 22 |
+----+----+-----+-----+-----+-----+
另请参见相关线程:
21首先,您必须计算数字,然后再打印-
2不使用软件包和模块:
nums= [[ 3, 4, -4, -8, -10, -12,], [ 5, 5, 3, -3, -4, -44,], [ 34,-4,-34, -22, 22, 22]]
t = ['|' + ''.join('%4i' % i for i in row) + ' |' for row in nums]
hdr = '+' + (len(t[0])-2) * '-' + '+'
print '\n'.join( [hdr] + t + [hdr] )
这将产生以下输出:
+-------------------------+
| 3 4 -4 -8 -10 -12 |
| 5 5 3 -3 -4 -44 |
| 34 -4 -34 -22 22 22 |
+-------------------------+
工作原理:
t=['|'+'.join(“%4i”%i表示行中的i)+'|'表示nums中的行]
包含除顶行和底行以外的所有内容。在其核心,数字被格式化为固定宽度,并根据规范对齐t
<代码>%4i表示允许四个空格,格式为整数,右对齐。许多其他规格也是可能的。例如,如果希望将5个空格宽的整数向左对齐,请使用%4i
%-5i
现在内部行保存在hdr='+'+(len(t[0])-2)*'-'+'+'
中,我们可以组装标题行和拖车行。这些行以加号开始和结束。其余部分填充了t
-
这会将打印'\n'。加入([hdr]+t+[hdr])
字符串添加到行列表hdr
的开头和结尾,然后使用换行符将所有行连接在一起,形成最终的表t
def mmmsd(row):
mean=sum(row)/len(row)
stddev = ( sum( (x-mean)**2.0 for x in row ) / float(len(row)) )**0.5
return '%6i%6i%6.2f%6.2f' % (min(row), max(row), mean, stddev)
nums= [[ 3, 4, -4, -8, -10, -12,], [ 5, 5, 3, -3, -4, -44,], [ 34,-4,-34, -22, 22, 22]]
stats = [mmmsd(row) for row in nums]
t = [10*' ' + '|' + ''.join('%6i' % i for i in row) + ' |' + st for row, st in zip(nums, stats)]
hdr = 10*' ' + '+' + (len(t[0])-12 - len(stats[0])) * '-' + '+' + len(stats[0]) * ' '
print '\n'.join( [hdr] + t + [hdr] )
这将产生以下结果:
+-------------------------------------+
| 3 4 -4 -8 -10 -12 | -12 4 -5.00 6.18
| 5 5 3 -3 -4 -44 | -44 5 -7.00 17.23
| 34 -4 -34 -22 22 22 | -34 34 3.00 24.92
+-------------------------------------+
不使用包和模块:
nums= [[ 3, 4, -4, -8, -10, -12,], [ 5, 5, 3, -3, -4, -44,], [ 34,-4,-34, -22, 22, 22]]
t = ['|' + ''.join('%4i' % i for i in row) + ' |' for row in nums]
hdr = '+' + (len(t[0])-2) * '-' + '+'
print '\n'.join( [hdr] + t + [hdr] )
这将产生以下输出:
+-------------------------+
| 3 4 -4 -8 -10 -12 |
| 5 5 3 -3 -4 -44 |
| 34 -4 -34 -22 22 22 |
+-------------------------+
工作原理:
t=['|'+'.join(“%4i”%i表示行中的i)+'|'表示nums中的行]
包含除顶行和底行以外的所有内容。在其核心,数字被格式化为固定宽度,并根据规范对齐t
<代码>%4i表示允许四个空格,格式为整数,右对齐。许多其他规格也是可能的。例如,如果希望将5个空格宽的整数向左对齐,请使用%4i
%-5i
现在内部行保存在hdr='+'+(len(t[0])-2)*'-'+'+'
中,我们可以组装标题行和拖车行。这些行以加号开始和结束。其余部分填充了t
-
这会将打印'\n'。加入([hdr]+t+[hdr])
字符串添加到行列表hdr
的开头和结尾,然后使用换行符将所有行连接在一起,形成最终的表t
def mmmsd(row):
mean=sum(row)/len(row)
stddev = ( sum( (x-mean)**2.0 for x in row ) / float(len(row)) )**0.5
return '%6i%6i%6.2f%6.2f' % (min(row), max(row), mean, stddev)
nums= [[ 3, 4, -4, -8, -10, -12,], [ 5, 5, 3, -3, -4, -44,], [ 34,-4,-34, -22, 22, 22]]
stats = [mmmsd(row) for row in nums]
t = [10*' ' + '|' + ''.join('%6i' % i for i in row) + ' |' + st for row, st in zip(nums, stats)]
hdr = 10*' ' + '+' + (len(t[0])-12 - len(stats[0])) * '-' + '+' + len(stats[0]) * ' '
print '\n'.join( [hdr] + t + [hdr] )
这将产生以下结果:
+-------------------------------------+
| 3 4 -4 -8 -10 -12 | -12 4 -5.00 6.18
| 5 5 3 -3 -4 -44 | -44 5 -7.00 17.23
| 34 -4 -34 -22 22 22 | -34 34 3.00 24.92
+-------------------------------------+
此变体计算打印前所需的最大列宽,因此所有列的宽度都相同,但不需要将宽度硬编码到打印格式字符串中。它使用方便但相对模糊的
*
格式参数来确定字段宽度
>>nums=[[3,4,-4,-8,-10,-12],[5,5,3,-3,-4,-44],[34,-4,-34,-22,22]]
>>>宽度=最大值(长度(str(i))表示i的总和(nums,[]))
>>>正文=“\n”.join(['|'+''.join(['%*d'(宽度,i)表示行中的i])+'|'表示行中的nums])
>>>cols=len(nums[0]);hdr='+'+(列*(宽度+1)+1)*'-'+'+'
>>>打印“%s\n%s\n%s%”(hdr,正文,hdr)
+-------------------------+
| 3 4 -4 -8 -10 -12 |
| 5 5 3 -3 -4 -44 |
| 34 -4 -34 -22 22 22 |
+-------------------------+
此变体计算打印前所需的最大列宽,因此所有列的宽度都相同,但无需将宽度硬编码到打印格式字符串中。它使用方便但相对模糊的*
格式参数来确定字段宽度
>>nums=[[3,4,-4,-8,-10,-12],[5,5,3,-3,-4,-44],[34,-4,-34,-22,22]]
>>>宽度=最大值(长度(str(i))表示i的总和(nums,[]))
>>>正文=“\n”.join(['|'+''.join(['%*d'(宽度,i)表示行中的i])+'|'表示行中的nums])
>>>cols=len(nums[0]);hdr='+'+(列*(宽度+1)+1)*'-'+'+'
>>>印刷品