Python 的 len() 和像 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, ...)
特别是我无法使用 list-comprehension 或 string.join(...) 获得干净的方法
''.join([s, '\t' * ntabs])
在没有特殊情况的情况下,len(s) < TABWIDTH 的整数倍,或者 len(s)>=maxlen。
谁能展示更好的 len() 和 pad_with_tabs() 函数?