2017-04-26 2 views
1

Warum ist der folgende Ausdruck, der darauf abzielt, mehrere Schlüssel in einem dict zu löschen, ungültig? (event ist ein dict)python dict keys im Listenverständnis löschen

[del event[key] for key in ['selected','actual','previous','forecast']] 

Was wäre der minimalsten Ausdruck mit ersetzen?

+5

Nein, es ist nicht gültig, weil 'del' kein Ausdruck ist. Verwenden Sie Listenkompromittierungen nicht für Nebenwirkungen, ** nur ** zum Erstellen einer Werteliste. –

+0

'für Schlüssel in ['ausgewählt', 'tatsächliche', 'vorherige', 'Prognose']: del Ereignis [Schlüssel]' – AChampion

+0

Python wird nicht einmal eine solche Zeile als gültigen Code akzeptieren. Es kann keine Aussagen in einem Listenverständnis geben. –

Antwort

9

Sie sollten hier kein Listenverständnis verwenden. List-Comprehensions eignen sich hervorragend zum Erstellen einer Werteliste und sollten nicht für allgemeine Schleifen verwendet werden. Die Verwendung eines Listenverständnisses für die Nebenwirkungen ist eine Verschwendung von Speicher auf einem vollkommen guten Listenobjekt.

Liste Verständnis sind auch Ausdrücke, so kann nur andere Ausdrücke enthalten. del ist eine Anweisung und kann nicht in einem Ausdruck verwendet werden.

Nur eine for Schleife verwenden:

# use a tuple if you need a literal sequence; stored as a constant 
# with the code object for fast loading 
for key in ('selected', 'actual', 'previous', 'forecast'): 
    del event[key] 

oder das Wörterbuch mit einem Wörterbuch Verständnis neu zu erstellen:

# Use a set for fast membership testing, also stored as a constant 
event = {k: v for k, v in event.items() 
     if k not in {'selected', 'actual', 'previous', 'forecast'}} 

Letztere ein völlig neues Wörterbuch erstellt, so dass andere Referenzen auf das gleiche Objekt gewonnen bestehenden sehe keine Änderungen.

Wenn Sie den Schlüssel löschen in einem Ausdruck verwenden müssen, können Sie object.__delitem__(key) verwenden, aber dies ist nicht der richtige Ort; Sie würden mit einer Liste mit None Objekten als Ergebnis enden, eine Liste, die Sie sofort verwerfen.