今のところ、文字列のリストで 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
orを使用します (str.split など)。itertools.imap
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