Как напечатать списки в списке в отдельных столбцах, используя для циклов? - PullRequest
1 голос
/ 23 июня 2019

Проблема из главы 6 ATBS.Это создание функции, которой передается список списков, а затем распечатывается каждый список, но выровненный таким образом, чтобы каждый столбец был аккуратным и пустым независимо от длины строк в списке.

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

table = [['Tom','Dick','Harry','John'],
         ['Apples','Oranges','Strawberries','Grapes'],
         ['Brocolli', 'Asparagus', 'Carrots', 'Potatoes']]




def printTable(tableData):
    colWidths = [0] * len(tableData)
    for i in range(len(tableData)):
        colWidths[i] = max(len(j) for j in tableData[i])
    for i in range(len(tableData)):
        for j in tableData[i]:
            print(j.rjust(colWidths[i]))



printTable(table)

Это печатает следующее

  Tom
 Dick
Harry
 John
      Apples
     Oranges
Strawberries
      Grapes
 Brocolli
Asparagus
  Carrots
 Potatoes

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

Ответы [ 3 ]

1 голос
/ 23 июня 2019

попробуйте это:

table = [['Tom','Dick','Harry','John'],
         ['Apples','Oranges','Strawberries','Grapes'],
         ['Brocolli', 'Asparagus', 'Carrots', 'Potatoes']]




def printTable(tableData):
    colWidths = [0] * len(tableData)
    for i in range(len(tableData)):
        colWidths[i] = max(len(j) for j in tableData[i])
    for i in range(len(tableData)):
        for j in tableData[i]:
            print(j.rjust(sum(colWidths[:i+1])))



printTable(table)

все, что я сделал, это изменил rjust, чтобы оправдать его не только для текущего столбца, но и для всех предыдущих столбцов.

хорошо, что вы уже поместили все ширины в список:)

0 голосов
/ 23 июня 2019
    table = [['Tom','Dick','Harry','John'],
         ['Apples','Oranges','Strawberries','Grapes'],
         ['Brocolli', 'Asparagus', 'Carrots', 'Potatoes']]




def printTable(tableData):
    buffer = []
    colWidths = [0] * len(tableData)
    for i in range(len(tableData)):
        colWidths[i] = max(len(j) for j in tableData[i])
    for j in range(len(tableData[i])):
        buffer.append("") #filling the buffer array with empty string could have used buffer = ["" for i in range(len(tableData[i]]))]
    for i in range(len(tableData)): 
        for j in range(len(tableData[i])):
            buffer[j] += (tableData[i][j].rjust(colWidths[i]))
            buffer[j] += " "
    for i in range(len(buffer)):
        print(buffer[i])






printTable(table)

Все, что я сделал, это определил буферный массив для хранения каждой строки, после этого я создал еще один цикл for для их печати.Когда вы печатаете строку, вы не можете вернуться к этой строке и добавить новый элемент, поэтому вам нужно сначала создать строку, которую вы хотите напечатать, а затем распечатать.Поскольку в выводе, который вы хотели получить, есть элемент из каждого списка, я объединил их в строку и разделил их пробелом.

Вывод

  Tom       Apples  Brocolli
 Dick      Oranges Asparagus
Harry Strawberries   Carrots
 John       Grapes  Potatoes
0 голосов
/ 23 июня 2019

Вот кое-что для начала: первая строка (назовем ее row0, потому что она с индексом 0) -

row0 = [x[0] for x in table]  

Для каждого списка x в таблице берется первый элемент.

Создайте второй ряд аналогично.

Чтобы получить все строки, поместите это в цикл for i in range(4)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...