4

特定の文字列「hello」のリストがあるかどうかを確認するにはどうすればよいですか。

x = ['hello', 'hello', 'hello']
# evaluates to True

x = ['hello', '1']
# evaluates to False
4

5 に答える 5

14

all()関数を使用して、条件がTrueすべての要素に当てはまるかどうかをテストします。

all(el == 'hello' for el in x)

このall()関数は iterable (結果を 1 つずつ生成するもの) を取り、Trueそれらの要素がすべて true の場合にのみ、それ自体を返します。間違っているものを見つけた瞬間に戻ってきて、それFalse以上は調べません。

ここで iterable はジェネレータ式で、入力シーケンスの各要素に対して等価性テストを実行します。false 値が検出された場合に早期に反復を停止するという事実all()により、含まれるジェネレーター式のテストが早い段階でいずれかの要素に対して False である場合、このテストは非常に効率的になります。

xifがemptyの場合、空のシーケンスで false である要素が見つからないだけでなく、返されることにall()注意してください。最初にシーケンスが空でないことをテストできます。True

if x and all(el == 'hello' for el in x):

それを回避するために。

于 2013-08-25T23:06:58.980 に答える
5

これはうまくいくはずです:

# First check to make sure 'x' isn't empty, then use the 'all' built-in
if x and all(y=='hello' for y in x):

allビルトインの良いところは、条件を満たさない最初の項目が見つかったときに停止することです。これは、大きなリストで非常に効率的であることを意味します。

また、リスト内のすべての項目が文字列の場合lower、文字列のメソッドを使用して、「HellO」、「hELLO」などと一致させることができます。

if x and all(y.lower()=='hello' for y in x):
于 2013-08-25T23:06:40.610 に答える
2

あなたが望むことを行うさらに別の方法(all他のすべての回答が指摘しているように、それを行うための最も慣用的な方法です)、複数回チェックする必要がある場合に役立ちます:

s = set(l)
cond = (len(s) == 1) and (item in s)

O(n)条件を確認するたびにトラバーサルを回避するのに役立ちます。

于 2013-08-25T23:21:57.867 に答える