2016-02-02 4 views
1

Я хочу, чтобы вывести текст следующим образом:выравнивания строки при печати в питоне

Якета   : **************************** 1250.23 € 
Обувки за футбол : ********************** 912.30 € 
Екипи   : ************** 513.45 € 
Топки   : ************ 502.52 € 
T-SHIRTS   : ********* 420.19 € 

Как я могу использовать заполнители для отступа все колонов к длине самой длинной строки - в этом случае Обувки за футбол?

+1

Получите 'len' строки, вычтите ее из' len' самой длинной строки и добавьте много пробелов в конец строки. –

ответ

2

Возможно, самым элегантным способом является использование метода format. Это позволяет легко определить пространство строки будет использовать:

>>> name = 'Якета' 
>>> asterisks = '****************************' 
>>> price = 1250.23 
>>> print '{0:17}: {1} {2} €'.format(name, asterisks, price) 
Якета  : **************************** 1250.23 € 

Если вам необходимо программно определить размер отступа (например, динамически принимать большие строки вместо жесткого кодирования его размера), просто используйте ljust:

>>> name = 'Якета' 
>>> asterisks = '****************************' 
>>> price = 1250.23 
>>> padding = 17 
>>> print '{0}: {1} {2} €'.format(name.ljust(padding), asterisks, price) 
Якета  : **************************** 1250.23 € 

Учитывая тот случай, когда максимальный размер строки неизвестен ранее и сценарий должен адаптироваться к ней, нам нужно только вычислить максимальный размер строки и поместить его в padding:

>>> names = ['abc', 'defghijklm', 'op', 'q'] 
>>> asterisks = '****************************' 
>>> price = 1250.23 
>>> padding = max(map(len, strings)) 
>>> for name in names: 
     print '{0}: {1} {2} €'.format(name.ljust(padding), asterisks, price) 
abc  : **************************** 1250.23 € 
defghijklm: **************************** 1250.23 € 
op  : **************************** 1250.23 € 
q   : **************************** 1250.23 € 

This thread имеет довольно подобную проблему.

+1

Спасибо, но это многое я понял. Моя проблема связана с этим методом в динамической среде. Скажем, мы не знаем длину самой длинной строки, которую нужно напечатать, поэтому мы не можем жестко указывать отступы внутри заполнителя: {0:17}. Есть ли вариант вложенного заполнителя, который я могу использовать для этого случая? – Alex

+0

Вот что мой второй пример. Просто поместите свой самый длинный размер строки в переменную 'padding', и все будет хорошо и Pythonic. Скажем, у вас есть строки 'strings = ['abc', 'defghijklm', 'op', 'q']' со всеми вашими строками. Затем прокладка может быть рассчитана с использованием 'padding = max (map (len, strings))', что делает 'padding = 10'. –

+0

Я только что обновил ответ, чтобы включить этот случай, Alex –

1

Я хотел бы сделать что-то вроде этого (несколько "хака"):

  • Получить самую длинную строку longest = len(longest_string). Если у вас есть ваши строки в list, то longest = len(max(mylist, key=len)).
  • Рассчитать для всех строк spaces = longest - len(str).
  • Добавить spaces пробелы на каждый конец строки.
+0

Я думал об этом, но я решил, что у python должно быть что-то более чистое. – Alex

+0

@Alex Я вижу, ну это первое, что пришло в голову - легко придумать, понять и реализовать :) – Idos

+1

Ну спасибо. Я буду реализовывать его, так как я пока не могу придумать или найти что-нибудь, что мне нравится. – Alex