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

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

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

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

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

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

enter image description here

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 09 января 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), это хорошая идея - если кто-то не пытается преподать вам урок об их полезности или о том, как написать петли. Но тогда вы, вероятно, не должны спрашивать здесь ...

0 голосов
/ 09 января 2019

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

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

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

...