2009-06-02 12 views
3

私はリストを持っているといい、そのリストが別のリスト内にあるかどうかをチェックしたいと思います。私はこれをやっていることを行うことができます正常に動作しますが、私は昇給に必要な値は、それが欠落していることを値で、不足している例外をしたいと言うことができますリスト内包と例外の使用?

all(value in some_map for value in required_values) 

を。リストの理解を使って、どうすればいいですか?

私は多かれ少なかれ好奇心が強いですが、すべての兆候はいいえを指しているようです。

EDITなんてこった、私はこの意味:

for value in required_values: 
if value not in some_map: 
    raise somecustomException(value) 

は、私はあなたが重複して検討する必要がない場合は、エラーが

+0

と非常によく似ています:http://stackoverflow.com/questions/1528237/how-can-i-handle-exceptions-in-a-list-comprehension-in-python –

答えて

14

必要な値が不足している場合に値が欠けている場合に例外を発生させたいとします。リストの理解を使って、どうすればいいですか?

リストの内包表記は、いくつかの既存のリスト - すばらしいスタイルない単一ライン内の任意のfor - ループを書くの汎用の方法に基づいてリストを作成するための構文的に簡潔な方法です。この例では、実際にはリストを作成していないので、リスト内包表記を使用する意味がありません。

+2

+1 "do not do list comprehensions"の場合 – Soviut

+0

私は今それについて詳しく見てきました。ありがとう。 – UberJumper

2

を発生した値を見つけることができる方法を見て傾けるものを見てみると値はハッシュ可能です。彼らはより速く、より簡単だし、一回の操作で欠落している「すべて」の要素を抽出することができます。

required_values = set('abc') # store this as a set from the beginning 
values = set('ab') 
missing = required_values - values 
if missing: 
    raise SomeException('The values %r are not in %r' % 
         (missing, required_values)) 
+1

'missing = required_values - 値 '? –

2

あなたはリストの内包に引き上げる使用することはできません。あなたはthe grammar in the Python Language Referenceを見て自分で確認できます。

ただし、例外を発生させる関数を呼び出すことはできます。

-2

私は(noskloの例のような)セットを使用して優れていると思いますが、あなたはこのような単純な何か行うことができます:別の(醜い)可能性がerror_on_false機能だろう

def has_required(some_map, value): 
    if not value in some_map: 
    raise RequiredException('Missing required value: %s' % value) 

all(has_required(some_map, value) for value in required_values) 
+0

これは、問題のポイントである例外に欠損値の名前を入れません。 – nosklo

+0

簡単に修理できます... – mattkemp

+0

今は動作しません。 * all * bultin関数は、私が試したリストで失敗します。 – nosklo

0

を:

def error_on_false(value) 
    if value: 
     return value 
    else: 
     raise Exception('Wrong value: %r' % value) 

if all(error_on_false(value in some_map) for value in required_values): 
    continue_code() 
    do_something('...') 

それは醜いです。代わりにsetを使用します。

0

私は今夜のことを考えていました。私のユースケースは、オブジェクトのリストを反復し、オブジェクトが特定の型でないときにエラーを発生させることです。私の解決策は発電機を使用することです。その後、私は自分の携帯電話上でこれを書いた

classes = [c for c in iter_my_class(my_class_list)] 

として使用

def iter_my_class(my_class_list): 
    for c in my_class_list: 
     if not isinstance(c, MyClass): 
      raise ValueError('Expected MyClass') 
     yield c 

。それがエラーなしで実行されるなら、あなたは私にビールを借りています。

関連する問題