Я пытаюсь создать хороший список столбцов в python для использования с инструментами администрирования командной строки, которые я создаю.
В принципе, мне нужен список вроде:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Превратиться в:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Использование простых вкладок здесь не поможет, потому что я не знаю самых длинных данных в каждой строке.
Это то же поведение, что и "column -t" в Linux.
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c"
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c" | column -t
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Я поискал для этого различные библиотеки Python, но не нашел ничего полезного.
Ответы:
Это вычисляет самую длинную запись данных, чтобы определить ширину столбца, а затем использовать
.ljust()
для добавления необходимого отступа при печати каждого столбца.источник
longest
вводит в заблуждение, потому что это не самый длинный элемент, а max_length. Кстати самый длинный можно принять что - то вроде:max((w for sub in data for w in sub), key=len)
. [PS не я проголосовал против]max((w for ...), key=len)
дает вам самую длинную запись, и вам нужно будет снова выполнить пробежкуlen
. Не мог решить, что было ясно, поэтому остановился на первом. Хороший аргумент в пользу вводящего в заблуждение имени переменной. Изменено.max(len(x) for sub in data for x in sub)
что тоже не создает ненужных списков.column -t
происходит.Начиная с Python 2.6+, вы можете использовать строку формата следующим образом, чтобы установить в столбцах минимум 20 символов и выровнять текст по правому краю .
Вывод:
источник
{: >20}
чтобы отображать больше полейЯ пришел сюда с теми же требованиями, но ответы @lvc и @ Preet кажутся более соответствующими тому,
column -t
что создается в этих столбцах, имеющих разную ширину:источник
map(len, map(str, col))
.Это немного поздно для вечеринки и бесстыдный плагин для пакета, который я написал, но вы также можете проверить пакет Columnar .
Он принимает список входных списков и список заголовков и выводит строку в табличном формате. Этот фрагмент создает таблицу в стиле докеров:
Или вы можете немного поиграть с цветами и границами.
Чтобы узнать больше об алгоритме определения размера столбца и увидеть остальную часть API, вы можете проверить ссылку выше или просмотреть репозиторий Columnar на GitHub.
источник
Сделать это нужно за 2 прохода:
str.ljust()
иstr.rjust()
источник
Такое перемещение столбцов - это работа для zip:
Чтобы найти необходимую длину каждого столбца, вы можете использовать
max
:Что вы можете использовать с подходящим заполнением для создания строк, которые будут передаваться
print
:источник
Чтобы получить более красивые таблицы вроде
вы можете использовать этот рецепт Python :
Страница рецептов Python содержит несколько улучшений.
источник
pandas
решение на основе создания фрейма данных:Чтобы удалить значения индекса и заголовка для создания желаемого вывода, вы можете использовать
to_string
метод:источник
Scolp - это новая библиотека, которая позволяет легко распечатывать потоковые столбчатые данные при автоматической настройке ширины столбца.
(Отказ от ответственности: я автор)
источник
Это устанавливает независимые, наиболее подходящие ширины столбцов на основе максимальной метрики, используемой в других ответах.
источник
Для ленивых
которые используют Python 3. * и Pandas / Geopandas ; универсальный простой внутриклассный подход (для «нормального» скрипта просто удалите self ):
Функция раскрашивания:
Заголовок:
а затем данные из фрейма данных Pandas / Geopandas:
Значение
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> столбцов, всего в данном случае 630, 35, 20
-> ширина столбца (обратите внимание, что вам нужно будет добавить длину\033[96m
- это для Python тоже строка), просто поэкспериментируйте :)>, <
-> выравнивание: вправо, влево (есть и=
для заполнения нулями)Результат:
источник
Небольшое изменение предыдущего ответа (у меня недостаточно комментариев, чтобы его прокомментировать). Библиотека форматов позволяет вам указать ширину и выравнивание элемента, но не то, где он начинается, то есть вы можете сказать «иметь ширину 20 столбцов», но не «начинать с столбца 20». Что приводит к этой проблеме:
Вывод
Ответ, конечно же, состоит в том, чтобы отформатировать и буквальные строки, что несколько странно сочетается с форматом:
Вывод
источник
Я нашел этот ответ очень полезным и элегантным, изначально отсюда :
Вывод
источник
Вот вариант ответа Шона Чина. Ширина фиксирована для каждого столбца, а не для всех столбцов. Также есть граница под первым рядом и между столбцами. ( Библиотека icontract используется для обеспечения соблюдения контрактов.)
Вот пример:
источник
обновлен причудливый рецепт @Franck Dernoncourt, чтобы он был совместим с Python 3 и PEP8
источник
Я понимаю, что этот вопрос старый, но я не понял ответа Antak и не хотел использовать библиотеку, поэтому я свернул свое собственное решение.
В решении предполагается, что записи представляют собой 2D-массив, все записи имеют одинаковую длину и все поля представляют собой строки.
источник