Как объединить эти столбцы? (Автоматизировать скучные вещи Глава 6 практического проекта) - PullRequest
1 голос
/ 09 октября 2019

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

Я попытался объединить строки в цикле for, выполнив итерацию заранее (print(list[i]+list[i+1]+list[i+2]...etc), но я продолжаю получать ошибки index out of range, когда он повторяется снова и увеличивает i.

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

def longlen(strings):
    maximum = 0
    for s in strings:
        if len(s) > maximum:
            maximum = len(s)
    return(maximum)

def printTable(table):
    column_width = [0] * len(table)
    for i in range(len(table)):
        column_width[i] =longlen(table[i])
        for x in range(len(table[i])):
            print(table[i][x].rjust(column_width[i]))

printTable(tableData)

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

Прямо сейчасвыглядит так:

  apples
 oranges
cherries
  banana
Alice
  Bob
Carol
David
 dogs
 cats
moose
goose

Мне нужно это:

apples   Alice  dogs
oranges  Bob    cats
cherries Carol  moose
banana   David  goose

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы можете сделать это в два шага:

  1. Пройдите через каждую строку и выровняйте по правому краю каждое слово с помощью пробелов с помощью встроенного строкового метода rjust() чтобы все они имели одинаковую длину с самой длинной. Для этого вам нужно сначала определить самое длинное слово в строке, и это можно сделать с помощью комбинации функций max() и map().

  2. Используйте встроенную функцию zip(), чтобы транспонировать строки и столбцы таблицы и печатать каждую строку этого.

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

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

def printTable(table):
    for row in table:
        colwidth = max(map(len, row))
        row[:] = [word.rjust(colwidth) for word in row]

    for row in zip(*table):
        print(' '.join(row))


printTable(tableData)

Теперь вы можете увидеть, что они имеют в виду, что в Python есть «батареи». ;¬)

0 голосов
/ 09 октября 2019

Как-то так должно работать. Ради интереса, я добавил утку или две, и функция просто выведет пустой элемент, столбцы которого не имеют одинаковую длину

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

def printTable(table):
    # Get length of longest item in each column
    column_widths = [len(max(column, key=len)) for column in table]
    # Get longest column
    longest_col = len(max(table, key=len))
    # Major loop on each item in each nested list
    for j in range(longest_col):
        line = []
        # Nested loop over each nested list
        for i in range(len(table)):
            if j < len(table[i]):
                line.append(table[i][j].rjust(column_widths[i]))
            else:
                line.append(' '*column_widths[i])
        print('  '.join(line))

printTable(tableData)

Вывод:

  apples  Alice   dogs
 oranges    Bob   cats
cherries  Carol  moose
  banana  David   duck
                  duck
                 goose
...