Wenn Sie das Originalwörterbuch wirklich ändern müssen:
empty_keys = [k for k,v in metadata.iteritems() if not v]
for k in empty_keys:
del metadata[k]
Beachten Sie, dass wir eine Liste der leeren Schlüssel erstellen müssen, da wir ein Wörterbuch nicht ändern können, während wir es durchlaufen (wie Sie vielleicht bemerkt haben). Dies ist jedoch kostengünstiger (speichertechnisch) als das Erstellen eines brandneuen Wörterbuchs, es sei denn, es gibt viele Einträge mit leeren Werten.
nneonneo
quelle
quelle
.iteritems()
mit.items()
, wird der erste nicht mehr funktioniert in neuesten Python - Versionen.Antworten:
Die Lösung von BrenBarn ist ideal (und pythonisch, könnte ich hinzufügen). Hier ist jedoch eine andere (fp) Lösung:
quelle
Wenn Sie einen umfassenden und dennoch prägnanten Ansatz für den Umgang mit realen Datenstrukturen wünschen, die häufig verschachtelt sind und sogar Zyklen enthalten können, empfehlen wir Ihnen, das Dienstprogramm remap aus dem Dienstprogramm von bolons zu betrachten .
Nach
pip install boltons
oder Kopieren iterutils.py in Ihr Projekt, nur tun:Diese Seite enthält viele weitere Beispiele, einschließlich solcher, die mit viel größeren Objekten aus der Github-API arbeiten.
Es ist reines Python, funktioniert also überall und ist in Python 2.7 und 3.3+ vollständig getestet. Das Beste von allem ist, dass ich es für genau solche Fälle geschrieben habe. Wenn Sie also einen Fall finden, der nicht funktioniert, können Sie mich nerven, um ihn hier zu beheben .
quelle
Basierend auf Ryans Lösung , wenn Sie auch Listen und verschachtelte Wörterbücher haben:
Für Python 2:
Für Python 3:
quelle
d = { "things": [{ "name": "" }] }
Wenn Sie ein verschachteltes Wörterbuch haben und möchten, dass dies auch für leere Unterelemente funktioniert, können Sie eine rekursive Variante von BrenBarns Vorschlag verwenden:
quelle
items()
anstelle voniteritems()
für Python 3Schnelle Antwort (TL; DR)
Beispiel01
Detaillierte Antwort
Problem
Lösung
Tücken
Alternatives Beispiel
Beispiel 02
Siehe auch
quelle
Für Python 3
quelle
Aufbauend auf den Antworten von patriciasz und nneonneo , und die Möglichkeit entfallen , dass Sie die Schlüssel löschen möchten , dass nur bestimmte falsy Dinge (zB
''
) , aber nicht andere (zB0
), oder vielleicht wollen Sie auch einige truthy Dinge enthalten (zB'SPAM'
) Dann könnten Sie eine hochspezifische Hitliste erstellen:Leider funktioniert das nicht ganz, weil zum Beispiel
0 in unwanted
ausgewertet wirdTrue
. Wir müssen zwischen0
und anderen falschen Dingen unterscheiden, also müssen wir verwendenis
:... bewertet zu
False
.Verwenden Sie es jetzt für
del
die unerwünschten Dinge:Wenn Sie ein neues Wörterbuch möchten, anstatt es zu ändern
metadata
:quelle
[]
Ich habe alle Antworten in diesem Thread gelesen und einige haben auch auf diesen Thread verwiesen: Entfernen Sie leere Diktate im verschachtelten Wörterbuch mit rekursiver Funktion
Ich habe hier ursprünglich eine Lösung verwendet und es hat großartig funktioniert:
Versuch 1: Zu heiß (nicht performant oder zukunftssicher) :
In der Python 2.7-Welt wurden jedoch einige Bedenken hinsichtlich Leistung und Kompatibilität geäußert:
isinstance
statttype
for
aus Effizienzgründen in einer Schleife abitems
stattdessen Python3 Safeiteritems
Versuch 2: Zu kalt (ohne Auswendiglernen) :
DOH! Dies ist nicht rekursiv und überhaupt nicht memoizant.
Versuch 3: Genau richtig (bisher) :
quelle
Mit Arrays gemischte Diktate
if isinstance(v, list):
, der die Liste mit der ursprünglichenscrub_dict(d)
Implementierung bereinigt .quelle
Eine alternative Möglichkeit besteht darin, das Wörterbuchverständnis zu verwenden. Dies sollte kompatibel sein mit
2.7+
quelle
Hier ist eine Option, wenn Sie verwenden
pandas
:quelle
Einige der oben genannten Methoden ignorieren, ob Ganzzahlen vorhanden sind, und schweben mit den Werten 0 und 0,0
Wenn jemand das oben Genannte vermeiden möchte, kann er den folgenden Code verwenden (entfernt leere Zeichenfolgen und keine Werte aus dem verschachtelten Wörterbuch und der verschachtelten Liste):
quelle
"Da ich derzeit auch eine Desktop-Anwendung für meine Arbeit mit Python schreibe, habe ich in einer Dateneingabeanwendung festgestellt, dass viele Eingaben vorhanden sind und einige nicht obligatorisch sind, sodass der Benutzer sie leer lassen kann. Zu Validierungszwecken ist sie leicht zu greifen alle Einträge und verwerfen dann den leeren Schlüssel oder Wert eines Wörterbuchs. Mein Code über a zeigt also, wie wir sie einfach herausnehmen können, indem wir das Wörterbuchverständnis verwenden und das Wörterbuchwertelement behalten, das nicht leer ist. Ich verwende Python 3.8.3
quelle
Einige Benchmarking:
1. Listenverständnis neu erstellen Diktat
2. Listenverständnis Diktat neu erstellen mit dict ()
3. Schleife und Löschschlüssel, wenn v Keine ist
So ist Loop and Delete bei 160 ns am schnellsten, das Listenverständnis ist bei ~ 375 ns halb so langsam und bei einem Aufruf von
dict()
ist es wieder halb so langsam ~ 680 ns.Wenn Sie 3 in eine Funktion einwickeln, wird sie wieder auf etwa 275 ns reduziert. Auch für mich war PyPy etwa doppelt so schnell wie Neet Python.
quelle
list(dic.items())
Py 3 aufrufen. del scheint für ein niedriges Verhältnis von Null / Leer-Werten immer noch schneller zu sein. Ich denke, das Erstellen dieser Liste ist für den Speicherverbrauch genauso schlecht wie das Neuerstellen des Diktats.