Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的动态字符串格式_Python_String Formatting - Fatal编程技术网

python中的动态字符串格式

python中的动态字符串格式,python,string-formatting,Python,String Formatting,我想按如下方式打印我的输出。虽然第一眼看上去很容易做到,但这里有一些问题。列的数量可以不同,可以是负数,也可以是不同数字的数字等 因此,我如何才能完美地做到这一点,使外部边界保持完整,而不考虑内部的各种因素 我知道我必须在python中使用字符串格式,但不知道如何使用。 1.我应该使用什么逻辑来打印标题+--+? 如何根据内部元素的数量确定长度? 2.如何以固定宽度和对齐方式打印数字 +---------------------------+ | 3 4 -4 -8 -10 -

我想按如下方式打印我的输出。虽然第一眼看上去很容易做到,但这里有一些问题。列的数量可以不同,可以是负数,也可以是不同数字的数字等

因此,我如何才能完美地做到这一点,使外部边界保持完整,而不考虑内部的各种因素

我知道我必须在python中使用字符串格式,但不知道如何使用。
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 |
+----+----+-----+-----+-----+-----+

另请参见相关线程:


这就是我喜欢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 |
+----+----+-----+-----+-----+-----+

另请参见相关线程:


1首先,您必须先计算数字,然后再打印-


2

1首先,您必须计算数字,然后再打印-


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
    <代码>%4i表示允许四个空格,格式为整数,右对齐。许多其他规格也是可能的。例如,如果希望将5个空格宽的整数向左对齐,请使用
    %-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
    <代码>%4i表示允许四个空格,格式为整数,右对齐。许多其他规格也是可能的。例如,如果希望将5个空格宽的整数向左对齐,请使用
    %-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)*'-'+'+'
>>>印刷品