Из примера, который 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', поскольку в противном случае это приведет к дополнительной пустой строке;
- строка строки лишена первого и последнего '|', а также каждый элемент лишен пробелов;
- есть проверка того, является ли количество столбцов в каждой строке одинаковым или нет.
Найти максимальную ширину каждого столбца, который возвращает список, размер которого количество столбцов, и который содержит максимальную ширину для каждого столбца:
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 |
Обратите внимание, что если список таблиц обеспечивается, то достаточно для повторения этого списка и вызова таких функций для правильной печати.
На примере вы дали не список списков. Пожалуйста, исправьте это заявление. – Rockybilly