今のところ、文字列のリストに対してstrip()を実行しようとしていますが、これを実行しました。
i = 0
for j in alist:
alist[i] = j.strip()
i+=1
それを行うためのより良い方法はありますか?
list
は型であるため、変数名として使用しないでください。関係なく:
list = map(str.strip, list)
これにより、関数str.strip
がlist
のすべての要素に適用され、新しいリストが返され、結果がlist
に保存されます。
リスト内包表記を使用できます
stripped_list = [j.strip() for j in initial_list]
ここでパフォーマンスに関する興味深い議論がいくつか行われたので、ベンチマークを提供しましょう。
_noslice_map : 0.0814900398254
slice_map : 0.084676027298
noslice_comprehension : 0.0927240848541
slice_comprehension : 0.124806165695
iter_manual : 0.133514881134
iter_enumerate : 0.142778873444
iter_range : 0.160353899002
_
そう:
map(str.strip, my_list)
は最速の方法であり、理解よりも少しだけ高速です。map
または_itertools.imap
_を使用します(str.splitなど)。my_list[:] = map...
_のような結果を割り当てます。スライス表記はわずかなオーバーヘッドしか発生せず、そのリストへの参照が複数ある場合はバグを回避できる可能性があります。私はあなたが意味すると思います
a_list = [s.strip() for s in a_list]
ジェネレータ式を使用することは、次のようなより良いアプローチかもしれません。
stripped_list = (s.strip() for s in a_list)
遅延評価の利点を提供するため、strip
は、指定された要素(ストリップ)が必要な場合にのみ実行されます。
リストへの参照を現在のスコープ外でそのまま維持する必要がある場合は、リストスライス構文を使用することをお勧めします。
a_list[:] = [s.strip() for s in a_list]
さまざまなアプローチの速度に関心のあるコメント投稿者にとって、CPythonではジェネレーターからスライスへのアプローチが最も効率が悪いように見えます。
>>> from timeit import timeit as t
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""")
4.35184121131897
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""")
2.9129951000213623
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""")
2.47947096824646