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 = 8def 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) =maxlen 已经。谁能展示更好的 len() 和 pad_with_tabs() 函数? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 TABWIDTH=8def my_len(s): return len(s.expandtabs(TABWIDTH))def pad_with_tabs(s,maxlen): return s+"\t"*((maxlen-len(s)-1)/TABWIDTH+1)为什么我使用 expandtabs() ?嗯,它很快$ python -m timeit '"Bear\tnecessities\t".expandtabs()'1000000 loops, best of 3: 0.602 usec per loop$ python -m timeit 'for c in "Bear\tnecessities\t":pass'100000 loops, best of 3: 2.32 usec per loop$ python -m timeit '[c for c in "Bear\tnecessities\t"]'100000 loops, best of 3: 4.17 usec per loop$ python -m timeit 'map(None,"Bear\tnecessities\t")'100000 loops, best of 3: 2.25 usec per loop任何对字符串进行迭代的内容都会变慢,因为即使您在循环中什么都不做,迭代也比 expandtabs 慢约 4 倍。$ python -m timeit '"Bear\tnecessities\t".split("\t")'1000000 loops, best of 3: 0.868 usec per loop即使只是在选项卡上拆分也需要更长的时间。您仍然需要遍历拆分并将每个项目填充到制表位 (adsbygoogle = window.adsbygoogle || []).push({});
10-08 14:46