Рассчитать из списков и распечатать вывод в виде таблицы - PullRequest
0 голосов
/ 05 января 2020

Я новичок в python.

У меня есть следующие списки:

hardware = ["motherboard", "cpu", "gpu"]

сумма = [5, 8, 4, 6]

стоимость = [210,0, 250,5, 360,8]

Я хочу напечатать вывод, как вы можете видеть в текстовом файле, предоставленном в ссылка ниже.

Моя попытка следующая:

hardware = ["motherboard", "cpu", "gpu"]
amount = [5, 8, 4, 6]
cost   = [210.0, 250.5, 360.8]

product_cost = [a*b for a,b in zip(amount, cost)]
total = sum(product_cost)

titles = ['Hardware', 'Amount', 'Cost per item', 'Total cost per hardware']
data = [titles] + list(zip(hardware, amount, cost, product_cost))

for i, d in enumerate(data):
    line = ' '.join(str(x).ljust(12) for x in d)
    print(line)
    if i == 0:
        print(' ' * len(line))

print('\n' "Total cost: " + str(total))

Но вывод, который я получаю, не тот, который вы можете видеть в текстовом файле

Я прикрепляю текст файл. Вот ссылка txt:

https://drive.google.com/open?id=1vANzMk9z2cxTWJRlwH3AkudN_jlG3iah

Можете ли вы помочь мне получить желаемый результат.

Ответы [ 2 ]

0 голосов
/ 05 января 2020

Сначала необходимо преобразовать строки в столбцы и рассчитать максимальную длину в каждом столбце

rows = [titles] + list(zip(hardware, amount, cost, product_cost))

columns = list(zip(*rows))

lengths = [max([len(str(x)) for x in col]) for col in columns]

Затем необходимо, чтобы каждый элемент в строке отображался отдельно, поскольку для первого столбца нужно ljust, а для других столбцов - rjust - и все они должны отличаться от lenghts

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

hardware = ["motherboard", "cpu", "gpu"]
amount = [5, 8, 4, 6]
cost   = [210.0, 250.5, 360.8]
product_cost = [a*b for a,b in zip(amount, cost)]

total = sum(product_cost)

titles = ['Hardware', 'Amount', 'Cost per item', 'Total cost per hardware']

rows = [titles] + list(zip(hardware, amount, cost, product_cost))

columns = list(zip(*rows))
lengths = [max([len(str(x)) for x in col]) for col in columns]
#print(lengths)

for y, row in enumerate(rows):
    for x, item in enumerate(row): 
        l = lengths[x]
        if x == 0:
            print(str(item).ljust(l), end='')
        elif x == 1:
            print(str(item).rjust(l+2), end='')
        else:
            print(str(item).rjust(l+5), end='')
    print()
    if y == 0:
        print()

print('\nTotal cost: {:.2f}'.format(total))

Результат

Hardware     Amount     Cost per item     Total cost per hardware

motherboard       5             210.0                      1050.0
cpu               8             250.5                      2004.0
gpu               4             360.8                      1443.2

Total cost: 4497.20

РЕДАКТИРОВАТЬ: Аналогично модулю таблица

hardware = ["motherboard", "cpu", "gpu"]
amount = [5, 8, 4, 6]
cost   = [210.0, 250.5, 360.8]
product_cost = [a*b for a,b in zip(amount, cost)]
total = sum(product_cost)

titles = ['Hardware', 'Amount', 'Cost per item', 'Total cost per hardware']
rows = list(zip(hardware, amount, cost, product_cost))

import tabulate

print(tabulate.tabulate(rows, headers=titles, floatfmt=".1f"))

print('\nTotal cost: {:.2f}'.format(total))

Результат:

Hardware       Amount    Cost per item    Total cost per hardware
-----------  --------  ---------------  -------------------------
motherboard         5            210.0                     1050.0
cpu                 8            250.5                     2004.0
gpu                 4            360.8                     1443.2

Total cost: 4497.20
0 голосов
/ 05 января 2020

Это должно соответствовать желаемому результату. Вы можете настроить интервал в таблице для себя.

hardware = ["motherboard", "cpu", "gpu"]
amount = [5, 8, 4, 6]
cost   = [210.0, 250.5, 360.8]

product_cost = [a*b for a,b in zip(amount, cost)]
total = sum(product_cost)

titles = ['Hardware', 'Amount', 'Cost per item', 'Total cost per hardware']
data = [titles] + list(zip(hardware, amount, cost, product_cost))

for i in range(len(data)):
    if i == 0:
      print('{:<15s}{:>10s}{:>20s}{:>30s}'.format(data[i][0],data[i][1],data[i][2],data[i][3]))
      print()
    else:
      print('{:<15s}{:>10d}{:>20.2f}{:>30.2f}'.format(data[i][0],data[i][1],data[i][2],data[i][3]))

print('\n' "Total cost: %.2f" % (total))

enter image description here

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