21

今のところ、文字列のリストで strip() を実行しようとしましたが、これを行いました:

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

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

4

4 に答える 4

35

list型なので、変数名として使用するべきではありません。関係なく:

list = map(str.strip, list) 

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

于 2012-08-29T16:50:57.547 に答える
19

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

stripped_list = [j.strip() for j in initial_list]
于 2012-08-29T16:52:41.357 に答える
10

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

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)が最速の方法です。理解よりも少しだけ高速です。
    • 適用したい単一の関数がある場合はmaporを使用します (str.split など)。itertools.imap
    • より複雑な表現がある場合は、内包表記を使用します
  2. 手動反復は最も遅い方法です。合理的な説明は、インタプリタがより多くの作業を行う必要があり、効率的な C ランタイムはより少ない作業を行うということです。
  3. 先に進んで のような結果を割り当ててmy_list[:] = map...ください。スライス表記は小さなオーバーヘッドをもたらすだけであり、そのリストへの複数の参照がある場合、いくつかのバグを免れる可能性があります。
    • リストの変更と再作成の違いを理解してください。
于 2012-08-29T17:25:25.727 に答える
3

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

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
于 2012-08-29T16:51:55.423 に答える