15

私はリスト内包表記に愛憎関係があります。一方では、私は彼らがきちんとしていてエレガントだと思います. 一方、私はそれらを読むのが嫌いです。(特に私が書いていないもの) 私は通常、速度が必要になるまで読みやすいようにするというルールに従います。したがって、私の質問は現時点では本当に学術的です。

文字列に余分なスペースが含まれていることが多いテーブルからステーションのリストが必要です。それらのスペースを取り除く必要があります。場合によっては、これらのステーションが空白であり、含めるべきではありません。

stations = []
for row in data:
    if row.strip():
        stations.append(row.strip())

これは、次のリスト内包表記に変換されます。

stations = [row.strip() for row in data if row.strip()]

これは十分に機能しますが、私はストリップを 2 回行っていることに気付きました。.strip() は実際には 2 回必要ではなく、変数を割り当てるだけよりも一般的に遅いと思いました。

stations = []
for row in data:
    blah = row.strip()
    if blah:
        stations.append(blah)

私が正しかったことがわかりました。

> Striptwice list comp 14.5714301669     
> Striptwice loop 17.9919670399
> Striponce loop 13.0950567955

2 つのループ セグメント間の時間は、2 番目 (1 回ストリップ) の方が高速です。ここで本当の驚きはありません。ストリップを 2 回実行しているにもかかわらず、リストの理解がわずかに遅いだけであることに驚いています。

私の質問:ストリップを 1 回だけ行うリスト内包表記を作成する方法はありますか?



結果:

提案のタイミング結果は次のとおりです

# @JonClements & @ErikAllik
> Striptonce list comp 10.7998494348
# @adhie
> Mapmethod loop 14.4501044569
4

3 に答える 3

29

あります-最初に削除された文字列のジェネレーターを作成してから、それを使用します:

stations = [row for row in (row.strip() for row in data) if row]

また、comp なしで記述することもできます ( Python 2.x の場合はスワップしimapて削除します)。list

stations = list(filter(None, map(str.strip, data)))
于 2013-10-04T15:35:21.957 に答える
13

ネストされた内包表記は読みにくい場合があるため、私の最初の好みは次のとおりです。

stripped = (x.strip() for x in data)
stations = [x for x in stripped if x]

または、インラインstripped化すると、単一の (ネストされた) リスト内包表記が得られます。

stations = [x for x in (x.strip() for x in data) if x]

最初の/内部内包表記は、実際にはジェネレーター式であることに注意してください。つまり、これは遅延リスト内包表記です。これは、2 回繰り返すことを避けるためです。

于 2013-10-04T15:36:33.743 に答える
1

map() を使用してすべての要素にストリップを適用し、その後フィルターを適用します。

[item for item in map(lambda x: x.strip(), list) if item]
于 2013-10-04T15:38:04.800 に答える