Форматировать вывод из списка списков в столбцы - PullRequest
1 голос
/ 12 апреля 2020

Я работаю с базой данных и пытаюсь перечислить все таблицы в этой одной базе данных. Я могу напечатать их нормально, но у меня проблемы с форматированием таблиц. Я использовал pandas для форматирования, и это работает, но я пытаюсь создать это без pandas. Вот как это печатается до сих пор:

TerritoryID TerritoryDescription RegionID
1581 Westboro 1
1730 Bedford 1
1833 Georgetown 1
2116 Boston 1
2139 Cambridge 1

Я пытаюсь заставить его выглядеть примерно так:

   TerritoryID TerritoryDescription RegionID
1. 1581        Westboro             1
2. 1730        Bedford              1
3. 1833        Georgetown           1
4. 2116        Boston               1
5. 2139        Cambridge            1

Я пытался найти максимум длина списков и форматирование их таким образом, так как есть другие таблицы, которые я пытаюсь отформатировать. Это то, что я пытался сделать, но я получаю сообщение об ошибке: object of type 'int' has no len()

def categories(menu, choice, cursor, connection):
    sql = "SELECT * FROM " + menu[choice - 1]
    cursor.execute(sql)
    rows = cursor.fetchall()
    lst = [list(elem) for elem in rows]
    connection.close()
    return lst


def columns(lst, cursor):
    header = []
    for field in cursor.description:
        header.append(field[0])
    print(' '.join(header))
    length_list = [len(element) for row in lst for element in row]
    column_width = max(length_list)
    for row in lst:
        row = "".join(element.ljust(column_width + 2) for element in row)
        print(row)

Как бы я исправить эту ошибку? Или есть другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Не каждый элемент в row является строкой. Вы не можете взять len() из int. Поэтому убедитесь, что все является строкой, прежде чем брать ее длину.

Попробуйте внести следующие изменения:

ДО

length_list = [len(element) for row in lst for element in row]

ПОСЛЕ

length_list = [len(str(element)) for row in lst for element in row]

и также измените эту строку тоже (обернуть element в str():

ДО

row = "".join(element.ljust(column_width + 2) for element in row)

ПОСЛЕ

row = "".join(str(element).ljust(column_width + 2) for element in row)
1 голос
/ 12 апреля 2020

Вы можете распечатать списки списков в виде таблиц, используя строки формата python:

# Input is expected as a list of list
rows = [
    ["TerritoryID", "TerritoryDescription", "RegionID"],
    ["1581", "Westboro", "1"], 
    ["1730","Bedford","1"], 
    ["1833","Georgetown","1"], 
    ["2116","Boston","1"], 
    ["2139","Cambridge","1"],
]

# First we get the max width of each column, like so:
max_col = list(max(map(len, x)) + 2 for x in list(map(list, zip(*rows))))

# Set some padding for the index column:
idx_pad = len(str(len(rows))) + 2

# Create a format string that will accept both values, and paddings:
s = "{:<{}}" + "{:<{}}" * len(max_col)

# Iterate the list of lists, printing each row:
for i, row in enumerate(rows):
    if i == 0:
        i = ""
    c = row + max_col
    c[::2] = row
    c[1::2] = max_col
    print(s.format(i, idx_pad, *c))
    idx_pad = old_idx

, которые будут распечатаны:

   TerritoryID  TerritoryDescription  RegionID  
1  1581         Westboro              1         
2  1730         Bedford               1         
3  1833         Georgetown            1         
4  2116         Boston                1         
5  2139         Cambridge             1         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...