2016-09-05 5 views
1

私は、特定のサブストリングを検索し、サブストリングがリスト内のすべてのストリングに存在する場合にのみ結果を返すストリングのリストを持っています。私の最初のアイデアは、サブストリングが私のリストの各大きな文字列に存在するかどうかに対応するブール値のリストを作成し、このブール値のリストがすべてのインデックスで真であるかどうかをチェックする別のループを作成することでした。誰かがよりエレガントで効率的な方法のための提案を持っていますか?リストのすべての文字列に特定の文字列が含まれているかどうかを追跡する方法はありますか?

ありがとうございます!

+0

単一のリスト内包表記は、それを行う必要があります。 – Andrew

+0

[all()](https://docs.python.org/3/library/functions.html#all)が役立ちます。 – wwii

答えて

2

あなたはall()inを使用することができます。

l = ["pie", "lie", "die"] 
all(['ie' in x for x in l]) 

上記のバージョンはunnecessary checksを行うことができます。

all('ie' in x for x in l) 
+1

listcompを不必要に使用すると、短絡が防止されます。 – DSM

+0

私は答えを編集しました、今私はショートサーキット:)感謝について検索する必要があります。 – Tempux

0

私は使い捨ての中間リストを作成しないようにgenerator expressionと一緒にビルトインall機能を使用します。コードを1行として表現することができるので、私はまた、代わりに通常のdef function()lambda expressionを使用してそれを定義したい:

# define function via lambda 
in_all = lambda strings, specific: all(specific in strng for strng in strings) 
in_all.__doc__ = """ Check whether all strings in list contain specified string. """ 

l1 = ["day", "lay", "may"] 
l2 = ["day", "lay", "may", "not"] 

print(in_all(l1, "ay")) # -> True (all had specific string) 
print(in_all(l2, "ay")) # -> False (at least one didn't have 
         #   the specific string) 
+0

ラムダを使用してすぐに名前を付けるのは、とにかく不便ですが、手動でダンダーを使ってそれを記録しますか?普通の関数構文を使用するだけではどうですか? – DSM

+0

私は短い機能を定義するためにlamdasを使用するのは嫌ですが、doc文字列に関するあなたのポイントは有効です。私はちょうどオブジェクトが機能であることを示すために正当な理由なしにそれを投げただけです。おそらくほとんどの人は気にしないでしょうし、ほとんどの短い機能には必要のないものがあります。 – martineau

関連する問題