web-dev-qa-db-ja.com

文字列のリストでstrip()を使用するより良い方法はありますか? -python

今のところ、文字列のリストに対してstrip()を実行しようとしていますが、これを実行しました。

i = 0
for j in alist:
    alist[i] = j.strip()
    i+=1

それを行うためのより良い方法はありますか?

20
alvas

listは型であるため、変数名として使用しないでください。関係なく:

list = map(str.strip, list) 

これにより、関数str.striplistのすべての要素に適用され、新しいリストが返され、結果がlistに保存されます。

30
eduffy

リスト内包表記を使用できます

stripped_list = [j.strip() for j in initial_list]
18
karthikr

ここでパフォーマンスに関する興味深い議論がいくつか行われたので、ベンチマークを提供しましょう。

http://ideone.com/ldId8

_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
_

そう:

  1. map(str.strip, my_list)は最速の方法であり、理解よりも少しだけ高速です。
    • 適用する関数が1つしかない場合は、mapまたは_itertools.imap_を使用します(str.splitなど)。
    • より複雑な表現がある場合は、内包表記を使用します
  2. 手動反復は最も遅い方法です。合理的な説明は、インタプリタがより多くの作業を行う必要があり、効率的なCランタイムはより少ない作業を行う必要があるということです
  3. 先に進み、_my_list[:] = map..._のような結果を割り当てます。スライス表記はわずかなオーバーヘッドしか発生せず、そのリストへの参照が複数ある場合はバグを回避できる可能性があります。
    • リストの変更と再作成の違いを理解してください。
8
Kos

私はあなたが意味すると思います

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
3
kojiro