Python の len() と string.ljust() のようなパディング関数はタブストップを認識しません。つまり、'\t' を他の半角文字と同様に扱い、len を最も近いタブストップの倍数に切り上げません。例:
len('Bear\tnecessities\t')
24 ではなく 17 です (つまり、4+(8-4)+11+(8-3) )。
そして、私もpad_with_tabs(s)
そのような関数が欲しいと言います
pad_with_tabs('Bear', 15) = 'Bear\t\t'
これらの単純な実装を探しています - コンパクトさと読みやすさを第一に、効率を第二に。これは基本的ですが、イライラする質問です。@gnibbler - たとえ20倍効率が悪いとしても、純粋にPythonicのソリューションを示すことができますか?
確かに 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() 関数をもっとうまく表示できますか?