Ад Все,
Я пытался распечатать табличные данные из двумерного списка числовые значения выравниваются по правому краю, строки выравниваются по левому краю, а ширина столбца определяется динамически на основе максимальной длины строки в каждом столбце.
Пример-А:
table = [['Name', 'Marks', 'Division', 'ID'], ['Raj', 7, 'A', 21], ['Shivam', 9, 'A', 52], ['Shreeya', 8, 'C', 27], ['Kartik', 5, 'B', 38]]
Name Marks Division ID
---- ----- -------- --
Raj 7 A 21
Shivam 9 A 52
Shreeya 8 C 27
Kartik 5 B 38
Пример-Б:
table = [['Name', 'Marks', 'Div', 'Role Number'], ['Raj', 7, 'A', 21], ['Shivam', 9, 'A', 52], ['Shreeya', 8, 'C', 27], ['Kartik', 5, 'B', 38]]
Name Marks Div Role Number
---- ----- --- -----------
Raj 7 A 21
Shivam 9 A 52
Shreeya 8 C 27
Kartik 5 B 38
Я мог бы определить максимальную длину каждого столбца, но не уверен, как печатать каждую строку с разной шириной выравнивания и что числовое значение выравнивается по правому краю, а строки выравниваются по левому краю.
rlen = []
for row in table:
clen = []
for col in row:
clen.append(len(str(col)))
rlen.append(clen)
width = [max(idx) for idx in zip(*rlen)]
print(width) #[7, 5, 8, 2]
Может кто-нибудь направить, пожалуйста, так как количество столбцов во входных данных может варьироваться.
Вы должны использовать f-string
для некоторого (базового) форматирования.
for i in table:
print(f'{i[0]:<10} {i[1]:>10} {i[2]:<10} {i[3]:>10}')
результат
Name Marks Div Role Number
Raj 7 A 21
Shivam 9 A 52
Shreeya 8 C 27
Kartik 5 B 38
Привет, Алекс, в моем случае значение ширины столбца зависит от максимальной длины строки в данном столбце. в вашем примере он зафиксирован на 10. Также входные данные могут иметь разные номера столбцов.
отредактировано, добавлено выравнивание по правому краю.
Вы можете попробовать что-то вроде следующего:
cols = []
for col in zip(*table):
just = str.ljust if isinstance(col[1], str) else str.rjust
strings = [str(item) for item in col]
width = max(map(len, strings))
cols.append(
[strings[0].ljust(width), (len(strings[0]) * "-").ljust(width)]
+ [just(string, width) for string in strings[1:]]
)
print("\n".join(" ".join(line) for line in zip(*cols)))
Решение о выравнивании принимается на основе типов 2. ряда.
Вывод для вашего второго примера
table = [['Name', 'Marks', 'Div', 'Role Number'], ['Raj', 7, 'A', 21], ['Shivam', 9, 'A', 52], ['Shreeya', 8, 'C', 27], ['Kartik', 5, 'B', 38]]
является
Name Marks Div Role Number
---- ----- --- -----------
Raj 7 A 21
Shivam 9 A 52
Shreeya 8 C 27
Kartik 5 B 38
Спасибо, Тимус. Это действительно великая мысль. Очень полезно. Мне пришлось внести небольшие изменения, чтобы настроить заголовок и подчеркивание - с "[strings[0].ljust(width), (len(strings[0]) * "-").ljust(width)]" на "[just( строки [0], ширина), просто (длина (строки [0]) * "-", ширина)]"
Если вы не знаете: пакет tabulate великолепен.