Python печатает табличные данные

Ад Все,

Я пытался распечатать табличные данные из двумерного списка числовые значения выравниваются по правому краю, строки выравниваются по левому краю, а ширина столбца определяется динамически на основе максимальной длины строки в каждом столбце.

Пример-А:

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]

Может кто-нибудь направить, пожалуйста, так как количество столбцов во входных данных может варьироваться.

Если вы не знаете: пакет tabulate великолепен.

Timus 18.11.2022 13:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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. Также входные данные могут иметь разные номера столбцов.

Susanta Dutta 18.11.2022 13:25

отредактировано, добавлено выравнивание по правому краю.

Alex 18.11.2022 13:31
Ответ принят как подходящий

Вы можете попробовать что-то вроде следующего:

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]) * "-", ширина)]"

Susanta Dutta 19.11.2022 03:27

Другие вопросы по теме