Вы можете сделать это:
spacing = [max(map(lambda x: len(str(x)), d)) for d in zip(*data)]
for row in data:
for i, elem in enumerate(row):
e = str(elem) + (',' if i < len(row) -1 else '')
print('{{:{}}} '.format(spacing[i]+1).format(e), end='')
print()
Результаты:
cat, 123, orange
elephant, 500000, green
horse, 123456.0, red
Пояснения:
spacing
определяется путем сбора максимальной длины каждого «столбца» в ваших данных. Мы можем сгруппировать столбцы, используя:
zip(*data)
Который дает транспонированную копию ваших данных следующим образом:
('cat', 'elephant', 'horse'),
(123, 500000, 123456.0),
('orange', 'green', 'red')
Затем мы используем функцию map
, чтобы применить функцию len(str(x))
к этим столбцам:
(3, 8, 5),
(3, 6, 8),
(6, 5, 3)
Затем мы просто получаем max
каждого столбца, объединяем все в понимании списка и возвращаем его как spacing
:
spacing = [max(map(lambda x: len(str(x)), d)) for d in zip(*data)]
Затем, пока мы перебираем ваши данные, мы также хотим enumerate(row)
, чтобы мы знали, с каким «столбцом» мы работаем. i
даст вам индекс столбца в дополнение к фактическому elem
.
После этого мы назначаем временный str
для добавления запятой, если это не последний элемент:
e = str(elem) + (',' if i < len(row) -1 else '')
Это делает его немного более читаемым, чем добавление его как части параметров формата.
После этого мы используем форматирование строки (или e.ljust(spacing[i] + 1)
, если хотите), чтобы добавить предопределенный максимум spacing
на основе столбца. Обратите внимание, что мы форматируем строку дважды, сначала экранируя внешние фигурные скобки ({{
и }}
), поэтому она может быть в последовательности:
'{{:{}}}.format(9).format(e)
# becomes
'{:9}'.format(e)
# becomes
'cat, '
Обратите внимание на использование end=''
, чтобы сделать линию печати непрерывной, пока не закончится row
. spacing[i] + 1
- учет добавленной запятой.
Я должен признаться, что это может быть не самым эффективным способом, но в зависимости от того, что вы пытаетесь достичь решения, может быть заметно иначе.