Создание таблицы в Python
Вот так я написал таблицу:
data = [["Категории", "Цена"],
{"book": 58, "organization": 0, "homegum": 55, "summer": 1,
"win": 85189}]
def create_table(data, header_separator=True):
header_cols = len(data[0])
# Сделал чтобы строки "Категории" и "Цена", вывводились
# в качестве заголовка
elem_col1 = [data[0][0]] + list(data[1].keys())
elem_col2 = [data[0][1]] + list(map(str, list(data[1].values())))
# Определяет ширину для каждого столбика
col_width = [len(max(elem_col1, key=len)),
len(max(elem_col2, key=len))]
# Границы заголовков столбцов
separator = "-+-".join('-' * n for n in col_width)
# Создание таблицы
i = 0
for col in range(len(elem_col1)):
if i == 1:
print(separator)
result = [elem_col1[col].rjust(col_width[0]),
elem_col2[col].rjust(col_width[1])]
i += 1
print(" | ".join(result))
create_table(data)
Как написать её лучше и правильней? (с такими же входными данными)
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Мне кажется, данными таблицы должны быть списки/кортежи, а в случаи словаря его нужно приводить к необходимому виду
Плюс, количество столбцов, из-за использования тела как словаря, будет 2, думаю нужно поддержать произвольное количество столбцов
def pretty_table(data, cell_sep=' | ', header_separator=True) -> str:
rows = len(data)
cols = len(data[0])
col_width = []
for col in range(cols):
columns = [str(data[row][col]) for row in range(rows)]
col_width.append(len(max(columns, key=len)))
separator = "-+-".join('-' * n for n in col_width)
lines = []
for i, row in enumerate(range(rows)):
result = []
for col in range(cols):
item = str(data[row][col]).rjust(col_width[col])
result.append(item)
lines.append(cell_sep.join(result))
if i == 0 and header_separator:
lines.append(separator)
return '\n'.join(lines)
Использование:
data = [
["Категории", "Цена"],
{"book": 58, "organization": 0, "homegum": 55, "summer": 1, "win": 85189}
]
rows = [
data[0]
]
rows += [(k, v) for k, v in data[1].items()]
print(pretty_table(rows))
Результат:
Категории | Цена
-------------+------
book | 58
organization | 0
homegum | 55
summer | 1
win | 85189
Автор решения: SergFSM
→ Ссылка
можно еще попробовать Format specifications, получится что-то вроде этого:
data = [
["Категории", "Цена"],
{"book": 58, "organization": 0, "homegum": 55, "summer": 1, "win": 85189}
]
print('{0:^14}|{1:^8}'.format(*data[0]), '-' * 14 + '+' + '-' * 8,
'\n'.join('{0:<14}|{1:>8}'.format(*i) for i in data[1].items()),sep='\n')
результат:
Категории | Цена
--------------+--------
book | 58
organization | 0
homegum | 55
summer | 1
win | 85189