Python 使用字符串格式创建二维列表

Python 使用字符串格式创建二维列表,python,string,formatting,Python,String,Formatting,假设输入“table”是字符串列表,目标是创建并返回格式化的 表示二维表的字符串 2D表格的每一行位于单独的行上;最后一行后面是一个空行 每列都向左对齐 柱用一根竖条“|”隔开;而且肯定只有一个空间 竖杆前后 每行以竖条开始和结束;而且在后面必须正好有一个空格 引导条和结束条之前 以下是我得到的: def show_table(table): new_string = '' for i in table: for j in range(len(i)):

假设输入“table”是字符串列表,目标是创建并返回格式化的
表示二维表的字符串

  • 2D表格的每一行位于单独的行上;最后一行后面是一个空行
  • 每列都向左对齐
  • 柱用一根竖条“|”隔开;而且肯定只有一个空间 竖杆前后
  • 每行以竖条开始和结束;而且在后面必须正好有一个空格 引导条和结束条之前
以下是我得到的:

def show_table(table):
    new_string = '' 
    for i in table: 
        for j in range(len(i)):
            line = i[j]
            new_string += '| {} '.format(i[j])
        new_string += '|\n'

    return new_string
当行间距相等时,我的代码在某些情况下有效。例如:

input: [['A','BB'],['C','DD']]
output: '| A | BB |\n| C | DD |\n'
print:| A | BB |
      | C | DD |
但是,当行不相似时,如下所示:

input: [['10','2','300'],['4000','50','60'],['7','800','90000']]
它导致我的输出不同:

Right_output: '| 10   | 2   | 300   |\n| 4000 | 50  | 60    |\n| 7    | 800 | 90000 |\n'
my_output: '| 10 | 2 | 300 |\n| 4000 | 50 | 60 |\n| 7 | 800 | 90000 |\n'
正确的输出应该正确地如下所示:

| 10   | 2   | 300   |
| 4000 | 50  | 60    |
| 7    | 800 | 90000 |
我的输出:

| 10 | 2 | 300 |
| 4000 | 50 | 60 |
| 7 | 800 | 90000 |
我需要在哪里修改代码以使打印输出与正确的输出匹配?我猜是关于柱子的最大宽度

使用
str.format()
(向左对齐)的字符串的语法如下:

>>> '{:10}'.format('test')
'test      '
在打印表格之前,需要预先计算列的宽度。这将产生正确的输出:

def show_table(table):
    new_string = ''

    widths = [max([len(col) for col in cols]) for cols in zip(*table)]

    for i in table:
        for j in range(len(i)):
            new_string += '| {:{}} '.format(i[j], widths[j])
        new_string += '|\n'

    return new_string

为了获得所需的输出,我将表元素的最大宽度集成到函数中:

def show_table(table):
    max_widths = map(max, map(lambda x: map(len, x), zip(*table)))
    new_string = '' 
    for i in table: 
        for j in range(len(i)):
            line = i[j]
            line = line + ' '*(max_widths[j]-len(line)) 
            new_string += '| {} '.format(line)
        new_string += '|\n'

    return new_string
要解释最大宽度线

max_widths = map(max, map(lambda x: map(len, x), zip(*table)))
…可分3个步骤完成:

  • 对表的行和列进行换位

    transposed = zip(*table)
    
  • 获取所有字符串的长度以允许比较

    lengths = map(lambda x: map(len, x), transposed)
    
  • 获取每列的最大长度

    max_widths = map(max, lengths)
    

  • AFAICS您的输出确实满足要求,而您想要的输出却不满足要求(在一些竖条之前有多个空格)。现在,如果您仍然需要其他输出,那么是的,您需要首先计算每个列的宽度,然后在格式化每个字符串时使用它。这意味着要对输入进行两次检查,我认为您无法避免。非常感谢您,您的代码完全有意义。小错误是new_string+='{{:>{}}'.format(widths[j]).format(i[j])。我认为“>”会使每一列向右对齐。我把它改成“@markzzz:Right,
    向右对齐。要向左对齐,你可以省略它(我已经更新了帖子)。