列表列表中列的最大长度

时间:2016-03-20 21:14:27

标签: python string formatting

给出列表清单的例子:

['| A   | B   |\n| CCC | DDD |\n'])

如何找到每列的最大列宽,将其打印为2D表格,并在其间保留所有正确的空格。

| A   | B   |
| CCC | DDD |

3 个答案:

答案 0 :(得分:2)

从OP在问题中显示的示例来看,实际上似乎表是以字符串编码的,其中列除以“|”和行除以'\ n'。

鉴于此设置(请,OP,在问题中修复它),在将表从字符串转换为实际列表列表之后,一种可能的方法是迭代每一行并确定每列中每个元素的长度并相应地改变大小。然后,使用有关每列宽度的信息打印表格的每个元素。

在下文中,实现算法的一般描述的函数是(模块化的不同方面被细分以及使OP的学习更容易):

  • 将字符串格式的表转换为列表列表,即行列表,每行包含一个字符串,其中包含给定列的实际元素:

    def transform_string_to_list_of_lists(input_string):
        rows = input_string.strip().split('\n')
        list_of_lists = []
        last_size = 0
        for i, row in enumerate(rows):
            row_list = [col.strip() for col in row[1:-2].split('|')]
            if i == 0:
                last_size = len(row_list)
            else:
                if len(row_list) != last_size:
                    print("Not a matrix")
                    return None        
            list_of_lists.append(row_list)
        return list_of_lists
    

    此功能需要注意三个不同的组件:

    • 字符串被剥去最后一个'\ n',否则会导致额外的空行;
    • 删除了第一个和最后一个'|'的行字符串,并且还删除了每个元素的空格;
    • 检查每行中的列数是否相同。
  • 查找每列的最大宽度,返回一个列表,其大小为列数,并包含每列的最大宽度:

    def find_each_column_width(input_table):
        columns_size = [0] * len(input_table[0])
        for row in input_table:      
            for j, column_element in enumerate(row):
                columns_size[j] = max(columns_size[j], len(column_element))
        return columns_size
    

    请注意columns_size初始化的方式。另请注意,在实际创建列表列表时,将检查表的一致性。

  • 返回包含格式化表格的字符串:

    def print_formatted_table(input_table, columns_width):
        output_table_string = ""
        for row in input_table:
            for i, element in enumerate(row):
                output_table_string = output_table_string + "| " + element.ljust(columns_width[i])
            output_table_string += " |\n"
        return output_table_string
    

    注意ljust会在字符串中添加一些尾随空格。

调用此类函数的一个示例是:

if __name__ == "__main__":       
    input_table_in_string = '| A | B |\n| CCC | DDD |\n'
    input_table = transform_string_to_list_of_lists(input_table_in_string)
    columns_width = find_each_column_width(input_table)
    print(print_formatted_table(input_table, columns_width))

导致以下输出:

| A  | B   |
| CCC| DDD |

请注意,如果提供了一个表列表,那么迭代该列表并调用这些函数就可以正确打印它们。

答案 1 :(得分:1)

您的问题中的示例不是列表列表。您可以查看此问题以创建列表列表

Python: list of lists

您可以这样打印出字符串:

d = []
d.append('| A   | B   |\n| CCC | DDD |\n')

col = d[0].split('\n')
temp=0
string =""
for i in col:
    print i

从' \ n'拆分字符串将它存储在一个数组中并打印出数组元素。

答案 2 :(得分:1)

您可以使用类似以下脚本的内容:

import csv
import StringIO


def write_cols(data, col_spacer='|'):
    widths = [0] * len(data[0])

    for row in data:
        widths[:] = [max(widths[index], len(str(col))) for index, col in enumerate(row)]

    return [col_spacer + col_spacer.join("{:<{width}}".format(col, width=widths[index]) for index, col in enumerate(row)) + col_spacer for row in data]


col_data = ['| A | B |\n| CCC | DDD |\n']
rows = col_data[0].split('\n')
cells = []

for row in csv.reader(rows, delimiter='|'):
    if len(row):
        cells.append([cell.strip() for cell in row[1:-1]])

for row in write_cols(cells):
    print row

这分为两部分,首先是原始数据中所有填充的条带,以[['A', 'B'], ['CCC', 'DDD']]形式创建一个正确的列表列表。然后将其传递给write_cols(),它会根据每列的最大宽度返回正确填充的数据。给你以下类型的输出:

|A  |B  |
|CCC|DDD|

更改write_cols(cells, " | ")会给您:

 | A   | B   | 
 | CCC | DDD |