Сначала необходимо преобразовать строки в столбцы и рассчитать максимальную длину в каждом столбце
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