从OP在问题中显示的示例来看,实际上表似乎是用字符串编码的,其中列被“|”除,行被“\n”除。在
有了这个设置(请,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'中删除,否则会导致额外的空行
行字符串去掉了第一个和最后一个“|”,每个元素也去掉了空白
检查每行的列数是否相同。在
找到每列的最大宽度,这将返回一个列表,该列表的大小为列数,并包含每个列的最大宽度:
^{pr2}$
请注意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
注意^{}在字符串中添加一些尾随空格。
调用此类函数的示例如下: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 |
请注意,如果提供了一个表列表,那么遍历该列表并调用此类函数以正确打印就足够了。在