4

リストがあるとしましょう。そのリストが別のリスト内に存在するかどうかを確認したいと思います。私はこれを行うことでそれを行うことができます:

all(value in some_map for value in required_values)

これは問題なく動作しますが、必要な値が欠落しているときに例外を発生させ、その値が欠落しているとしましょう。リスト内包表記を使用してそれを行うにはどうすればよいですか?

私は多かれ少なかれ興味があります、すべての兆候はノーを指しているようです。

編集ああ私はこれを意味しました:

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

それらを見ると、エラーが発生した値を見つける方法がわかりません

4

7 に答える 7

14

必要な値が欠落しているときに、その値が欠落している場合に例外を発生させたいとしましょう。リスト内包表記を使用してそれを行うにはどうすればよいですか?

リスト内包表記は、既存のリストに基づいてリストを作成するための構文的に簡潔な方法です。これらは、1行にループを記述する汎用的な方法ではありません。forこの例では、実際にはリストを作成していないため、リスト内包表記を使用しても意味がありません。

于 2009-06-02T17:33:13.257 に答える
2

重複を考慮せず、値がハッシュ可能である場合は、セットを使用します。それらはより簡単で高速であり、1回の操作で欠落している「すべての」要素を抽出できます。

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))
于 2009-06-02T17:24:05.530 に答える
2

リスト内包表記でraiseを使用することはできません。Python言語リファレンスの文法を見て自分で確認することができます。

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

于 2009-06-02T17:27:55.540 に答える
0

別の(醜い)可能性は次のerror_on_false関数です。

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ます。

于 2009-06-02T18:11:28.717 に答える
-2

セット(noskloの例のように)を使用する方が良いと思いますが、次のような簡単なことを行うことができます:

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)
于 2009-06-02T17:54:05.937 に答える