2016-05-26 11 views
0

hereパッド右複数行の文字列

'{0: <16}'.format('Hi') 

から、このコードスニペットを見つけた後、私は右パッドの文字列にできた - 私が後だ何をしています。 私は複数行の文字列を扱う関数を書いていますが、もっと速く、よりPythonの方法があると感じています。 文字列に "。"例のように。

#!/usr/bin/python 

def r_pad_string (s): 

    listy = s.splitlines() 

    w = 0 
    ss = "" 

    for i in range(0, len(listy)): 
    l = len(str(listy[i])) 
    if l > w: 
     w = l 

    for i in range(0, len(listy)): 
    pad = str(listy[i]).ljust(w, ".") 
    ss += pad + "\n" 

    return ss 


myStr1 = " ######\n" \ 
     " ########\n" \ 
     "## ## ##\n" \ 
     "## ### ###\n" \ 
     "##########\n" \ 
     "##########\n" \ 
     "## ## ##\n" \ 
     "# # #" 

myStr2 = """Spoons 
    are 
great!!!""" 

print r_pad_string(myStr1) 
print r_pad_string(myStr2) 

答えて

1
def r_pad_string2(s, fillchar='.'):      
    lines = s.splitlines() 
    max_len = max(len(l) for l in lines) 
    return '\n'.join(l.ljust(max_len, fillchar) for l in lines) 

タイミング:

In [12]: %timeit r_pad_string(myStr1) 
100000 loops, best of 3: 5.38 µs per loop 

In [13]: %timeit r_pad_string2(myStr1) 
100000 loops, best of 3: 3.43 µs per loop 

In [14]: %timeit r_pad_string(myStr2) 
100000 loops, best of 3: 2.48 µs per loop 

In [15]: %timeit r_pad_string2(myStr2) 
1000000 loops, best of 3: 1.9 µs per loop 

だから、それははるかに高速ではないですが、目に非常に簡単。

1

max -functionが存在するため、最初のループが削除されます。

def r_pad_string(s): 
    lines = s.splitlines() 
    width = max(len(l) for l in lines) 
    return "\n".join(
     line.ljust(width, ".") 
     for line in lines 
    ) 

総論:インデントは4つのレベルごとにスペースや変数名を話すべきであるべきであるとjoinは再び一緒にラインを堅持するために使用することができます。線の繰り返しは、索引の助けを借りてではなく、直接行うことができます。本当に読みやすくするために空行のみを使用してください。 listyの要素はすでに文字列なので、文字列に何度も何度も変換する必要はありません。