Функции Python len () и padding, такие как string.ljust (), не поддерживают табуляцию, т. Е. Обрабатывают '\ t' как любой другой символ одинарной ширины и не округляют len до ближайшего кратного табуляции ,
Пример:
len('Bear\tnecessities\t')
равно 17 вместо 24 (то есть 4+ (8-4) +11+ (8-3))
и скажите, что я тоже хочу функцию pad_with_tabs(s)
такую, что
pad_with_tabs('Bear', 15) = 'Bear\t\t'
В поисках простых реализаций - компактность и удобочитаемость, во-вторых, эффективность.
Это основной, но раздражающий вопрос.
@gnibbler - можете ли вы показать чисто Pythonic решение, даже если оно, скажем, в 20 раз менее эффективно?
Конечно, вы можете конвертировать туда и обратно, используя str.expandtabs (TABWIDTH), но это неуклюже.
Импорт математики для получения TABWIDTH * int( math.ceil(len(s)*1.0/TABWIDTH) )
также кажется огромным перебором.
Я не мог справиться с чем-то более элегантным, чем следующее:
TABWIDTH = 8
def pad_with_tabs(s,maxlen):
s_len = len(s)
while s_len < maxlen:
s += '\t'
s_len += TABWIDTH - (s_len % TABWIDTH)
return s
и поскольку строки Python являются неизменяемыми, и если мы не хотим обезопасить нашу функцию от патча в строковый модуль, чтобы добавить ее в качестве метода, мы также должны присвоить результат функции:
s = pad_with_tabs(s, ...)
В частности, я не мог получить чистые подходы с использованием списочного понимания или string.join (...)
''.join([s, '\t' * ntabs])
без специального случая, когда len (s) <целое число, кратное TABWIDTH, или len (s)> = maxlen уже.
Может кто-нибудь показать лучшие функции len () и pad_with_tabs ()?