![](/img/trans.png)
[英]Python find maximum string length in the list of lists of lists
[英]maximum length of a column in a list of lists
以列表列表為例:
['| A | B |\n| CCC | DDD |\n'])
如何找到每列的最大列寬,以將其打印為 2D 表,並在其間留出所有正確的空格。
| A | B |
| CCC | DDD |
從 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 |
請注意,如果提供了表列表,則只需遍歷該列表並調用此類函數以正確打印它們就足夠了。
在您的問題中給出的示例不是列表列表。 您可以檢查此問題以創建列表列表
您可以通過這種方式打印出字符串:
d = []
d.append('| A | B |\n| CCC | DDD |\n')
col = d[0].split('\n')
temp=0
string =""
for i in col:
print i
從 '\\n' 拆分字符串將其存儲在數組中並打印出數組的元素。
您可以使用類似以下腳本的內容:
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 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.