给出列表清单的例子:
['| A | B |\n| CCC | DDD |\n'])
如何找到每列的最大列宽,将其打印为2D表格,并在其间保留所有正确的空格。
| A | B |
| CCC | DDD |
答案 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
此功能需要注意三个不同的组件:
查找每列的最大宽度,返回一个列表,其大小为列数,并包含每列的最大宽度:
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)
您的问题中的示例不是列表列表。您可以查看此问题以创建列表列表
您可以这样打印出字符串:
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 |