使用字符串格式创建2D列表

时间:2016-03-20 17:00:05

标签: python string formatting

假设输入'table'是字符串列表的列表,目标是创建并返回格式化的
表示2D表的字符串。

  • 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 |

我需要在哪里修改我的代码才能使我的打印输出与正确的输出匹配?我想这是关于列的最大宽度的事情?

2 个答案:

答案 0 :(得分:1)

paddingstr.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

答案 1 :(得分:1)

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

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行......

max_widths = map(max, map(lambda x: map(len, x), zip(*table)))

......可以分三步完成:

  1. 转置表格的行和列

    transposed = zip(*table)
    
  2. 获取所有字符串的长度以进行比较

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

    max_widths = map(max, lengths)