Как напечатать список списков с выравниванием текста по ширине, целочисленная длина rjust() исходит из наибольшей длины строки в списках.

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

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

Данные списки списков:

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

и желаемый результат:

введите здесь описание изображения

Обратите внимание, что аргумент rjust() исходит из максимальной длины самого длинного слова в tableData.

Я вычислил максимальную целочисленную длину самого длинного слова в tableData следующим образом:

colWidths=[]
for i in range(len(tableData)):
    maxL=len(max(tableData[i], key=len))
    colWidths.append(maxL) 
max(colWidths)

Теперь я застрял, как написать цикл для печати списков в требуемом формате таблицы. (Я мог бы сделать это с помощью zip() или map(), но это не принято!) Любая помощь?


person Moh    schedule 08.01.2019    source источник
comment
Вы говорите, что вам не разрешено использовать map или zip где-либо в решении? Или просто не в той части, которая производит вывод?   -  person Grismar    schedule 09.01.2019
comment
да, его нельзя использовать где угодно :)   -  person Moh    schedule 09.01.2019


Ответы (3)


Если вы не хотите транспонировать таблицу, вы можете сделать это грязным способом:

for column in range(4):
    for row in range(3):
        print(tableData[row][column].rjust(10), end='')
    print('')

Диапазон столбцов/строк может быть установлен динамически, если это необходимо вашей задаче.

person Slam    schedule 08.01.2019
comment
Что если есть 10 под-списков по 6 элементов в каждом? что, если вы не знаете, сколько существует под-списков или сколько элементов они содержат/ - person wwii; 09.01.2019
comment
Отлично, я обновил, чтобы сделать его динамическим для столбцов, строк и аргумента rjust(). Спасибо :) - person Moh; 09.01.2019

Один лайнер, чтобы получить максимальную длину:

max_len = max(map(max, [map(len, l) for l in tableData]))

Но если вам каким-то образом запрещено использовать map, это еще проще:

max_len = 0
for l in tableData:
    for s in l:
        max_len = max(max_len, len(s))

И чтобы распечатать таблицу, основная проблема заключается в том, что таблицу необходимо сначала транспонировать:

printTableData = list(map(list, zip(*tableData)))

Опять же, без map или zip работы больше:

max_col_len = 0
for l in tableData:
    max_col_len = max(max_col_len, len(l))
printTableData2 = [[] for _ in range(max_col_len)]
for i in range(max_col_len):
    for j in range(len(tableData)):
        if i <= len(tableData[j]):
            printTableData2[i].append(tableData[j][i])
        else:
            printTableData2[i].append('')

И распечатать все это:

for l in printTableData:
    for s in l:
        sys.stdout.write(s.rjust(max_len+1))
    sys.stdout.write('\n')

Обратите внимание, что это не совсем то, что вам нужно, поскольку на изображении, которое вы предоставили, правая часть каждого столбца настроена отдельно. Итак, как полное решение:

import sys

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

max_lens = []
max_col_len = 0
for l in tableData:
    max_col_len = max(max_col_len, len(l))
    max_len = 0
    for s in l:
        max_len = max(max_len, len(s))
    max_lens.append(max_len)

printTableData = [[] for _ in range(max_col_len)]
for i in range(max_col_len):
    for j in range(len(tableData)):
        if i <= len(tableData[j]):
            printTableData[i].append(tableData[j][i])
        else:
            printTableData[i].append('')

for l in printTableData:
    for i in range(len(l)):
        sys.stdout.write(l[i].rjust(max_lens[i]+1))
    sys.stdout.write('\n')

Я не уверен, что пытаться решать проблемы, не используя то, что предоставляет вам язык (например, map и zip), является хорошей идеей, если только кто-то не пытается преподать вам урок их полезности или того, как писать циклы. Но тогда, наверное, не стоило здесь спрашивать...

person Grismar    schedule 08.01.2019
comment
Привет, спасибо за подробное решение. Я думаю, это просто чтобы узнать значение функций позже;) - person Moh; 09.01.2019

Пробовал сегодня эту проблему. По-видимому, пост больше не активен, но мое решение все еще размещено здесь.

tableData =  [['apples', 'oranges', 'cherries', 'banana'],
              ['Alice', 'Bob', 'Carol', 'David'],
              ['dogs', 'cats', 'moose', 'goose']]         

def printTable(table):
    for j in range(len(table[0])):
        for i in range(len(table)):
            length = len(max(tuple(table[i]),key=len))
            print(table[i][j].rjust(length), end=' ')
        print()
        
printTable(tableData)
person orbitze    schedule 07.07.2021