2017-10-03 3 views
0
[x.strip() for x in multi.splitlines() if len(x.strip()) > 0] 

.strip()コールを1つだけ使用してこのリストの解説を書き換えることが可能かどうか疑問に思っていました。この構造は私にそれを二度呼び出す必要があります。このリストの理解からstrip()コールを1つ減らすことはできますか?

私は

それはパフォーマンスが重要な問題ではないのですが、私はこのさえスリム声明作ることができればちょうど疑問に思っているようなリストに働いて、multi.splitlines()操作内部strip()を取得する方法を見つけ出すことができませんでした。文字列が空白文字だけが含まれているかどうかを確認する代わりに、フィルタで

+1

'trim()'とは何ですか?私はあなたが 'strip()'を意味すると思いますか? –

+0

@DavidZええと、strip()の意味 – user3556757

答えて

1

使用str.isspace:それだけでその長さをチェックするための新しい文字列を作成していないので

[x.strip() for x in multi.splitlines() if x and not x.isspace()] 

str.isspace高速です。

また、あなたは最初の文字列を取り除くことができ、その後、非空のものに保つ:

[x for x in map(str.strip, multi.splitlines()) if x] 
1

をそれとも、filterを使用することができますあなたが望むよう

filter(len, [x.strip() for x in lines]) 

これは、同じことを実現します。最初にすべての文字が削除され、空の文字列が削除されます。

+0

'filter'はPython 3でイテレータを返しますが、Python 2で返されたようなリストではないことに注意してください。 – Blckknght

+0

@Blckknght良い点。私はまだPython 2を使用します:)編集します。 – Maroun

0

条件で使用したい計算の結果からリストの理解度を作成する場合は、ジェネレータを使用して計算を実行するのが良い一般的な方法です。

(x.strip() for x in multi.splitlines()) 

と、あなたはその上であなたのリストの理解を構築することができます:あなたのケースでは、計算は、あなたが文字列のオフホワイトスペースを取り除きジェネレータで始めたいstrip()である。この中

[y for y in (x.strip() for x in multi.splitlines()) if len(y) > 0] 

ケース、strip()は、このメソッドを使用するかどうかは関係ありませんが、計算時間が長くかかったり、たくさんのリソースが必要な場合に便利です要素ごとに複数回

0

1つの選択肢は、現在のものの中に別の理解またはジェネレータの表現を入れ子にすることです。あなたは(そのようなメソッド呼び出しなど)重複表現を必要としませんので、外側の1は、内側の式によって得られた値に名前を割り当てます:私はif x代わりのif len(x) > 0を使用してい

[x for x in (y.strip() for y in multi.splitlines()) if x] 

注意を。この文脈では、まったく同じことを意味します。

関連する問題