【发布时间】:2010-12-17 07:06:39
【问题描述】:
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) =maxlen。
谁能展示更好的 len() 和 pad_with_tabs() 函数?
【问题讨论】:
-
不清楚你想要什么或者 str.expandtabs 如何不符合要求。一些示例输入和输出将有助于澄清。
-
我在第一行说了我想要的:len() 和 string.ljust() 的实现,它们都是制表符感知的。 str.expandtabs() 不符合要求,因为它将制表符爆炸为空格。如果我们只想测量 len(),我们不希望这样。使用 len(string.expandtabs(s)) 生成一次性副本似乎很浪费
-
"使用 len(string.expandtabs(s)) 生成一次性副本似乎很浪费" 为什么?对我来说,这似乎简单而干净。您是否有任何特定的配置文件编号表明这是您的应用程序的瓶颈?
-
如果你真的需要性能,就用C写函数
-
伙计们 - 让我们忽略效率并追求紧凑可读的 Pythonic 代码? (即使效率降低了 20 倍)gnibbler 有一个很好的解决方案,还有其他条目吗?
标签: python function padding tabstop