2009-06-02 8 views
3

Okay, sagen wir, ich habe eine Liste, und ich möchte überprüfen, ob diese Liste in einer anderen Liste existiert. Ich kann tun, dass dies zu tun:Verwenden von Listen-Comprehensions und Exceptions?

all(value in some_map for value in required_values) 

die gut arbeitet, läßt aber sagen, dass ich auf die Erhöhung will eine Ausnahme, wenn ein erforderlicher Wert fehlt, werden mit dem Wert, dass es fehlt. Wie kann ich das mithilfe des Listenverständnisses tun?

Ich bin mehr oder weniger neugierig, alle Zeichen scheinen auf Nein zu zeigen.

EDIT Argh bedeutete, dass ich dies:

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

an diejenigen, die ich kann nicht sehen, wie ich den Wert finden kann, wo der Fehler

+0

sehr ähnlich: http://stackoverflow.com/questions/1528237/how-can-i-handle-exceptions-in-a-list-comprehension-in-python –

Antwort

14

lässt sagen, ich möchte eine Ausnahme auslösen, wenn ein erforderlicher Wert fehlt, mit dem Wert, der fehlt. Wie kann ich das mithilfe des Listenverständnisses tun?

Liste Comprehensions ist eine syntaktisch prägnante Art und Weise, eine Liste zu erstellen, basierend auf einigen bestehende Liste-sie sind nicht eine Allzweck Art und Weise jeden for -loop in einer einzigen Zeile zu schreiben. In diesem Beispiel erstellen Sie keine Liste, daher ist es nicht sinnvoll, ein Listenverständnis zu verwenden.

+2

+1 für "nicht missbrauchen list comprehensions" – Soviut

+0

Ich stimme jetzt zu, dass ich mehr in es geschaut habe. Vielen Dank. – UberJumper

2

aufgetreten Wenn Sie Duplikate nicht berücksichtigen wollen und die Werte sind hashbar, verwenden Sie Sets. Sie sind einfacher, schneller und extrahieren „alle“ Elemente in einem einzigen Vorgang fehlt:

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

sollte es nicht 'missing = required_values ​​sein - Werte? –

2

Sie nicht erhöhen in einer Liste Verständnis verwenden können. Sie können dies überprüfen, indem Sie auf the grammar in the Python Language Reference schauen.

Sie können jedoch eine Funktion aufrufen, die eine Ausnahme für Sie auslöst.

-2

Während ich denke, unter Verwendung von Sätzen (wie nosklo dem Beispiel) ist besser, könnte man etwas Einfaches wie dies zu tun:

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

Das bringt den Namen des fehlenden Wertes nicht in die Ausnahme, was der Punkt der Frage ist. – nosklo

+0

Einfach genug, um zu reparieren ... – mattkemp

+0

Jetzt funktioniert es nicht. Die * all * bultin-Funktion schlägt mit jeder Liste fehl, die ich versuche. – nosklo

0

Weitere (hässlich) Möglichkeit wäre die error_on_false Funktion:

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('...') 

Das ist hässlich. Ich würde stattdessen die set verwenden.

0

Ich wunderte mich über heute Abend. Mein Anwendungsfall besteht darin, über eine Liste von Objekten zu iterieren und einen Fehler zu erzeugen, wenn das Objekt nicht von einem bestimmten Typ ist. Meine Lösung ist, einen Generator zu verwenden.

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

Dann als

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

ich das auf meinem Handy schrieb verwendet. Wenn das ohne Fehler läuft, schuldest du mir ein Bier.

Verwandte Themen