Ich habe eine dict
, die eine ganze Reihe von Einträgen hat. Ich interessiere mich nur für einige wenige. Gibt es eine einfache Möglichkeit, alle anderen auszuschneiden?
python
dictionary
mpen
quelle
quelle
Antworten:
Ein neues Diktat konstruieren:
Verwendet das Wörterbuchverständnis.
Wenn Sie eine Version verwenden, der sie fehlen (z. B. Python 2.6 und früher), machen Sie es
dict((your_key, old_dict[your_key]) for ...)
. Es ist das gleiche, wenn auch hässlicher.Beachten Sie, dass dies im Gegensatz zur Version von jnnnnn eine stabile Leistung (abhängig nur von der Anzahl Ihrer_Tasten) für
old_dict
s jeder Größe aufweist. Sowohl in Bezug auf Geschwindigkeit als auch Speicher. Da dies ein Generatorausdruck ist, verarbeitet er jeweils ein Element und durchsucht nicht alle Elemente von old_dict.Alles an Ort und Stelle entfernen:
quelle
old_dict
auf einen Fehler an anderer Stelle hinweist, und in diesem Fall bevorzuge ich einen Fehler gegenüber stillschweigend falschen Ergebnissen.Etwas eleganteres Diktatverständnis:
quelle
mydict.iteritems()
stattdessen verwenden..items()
erstellt eine andere Liste.Hier ist ein Beispiel in Python 2.6:
Der Filterteil ist die
if
Anweisung.Diese Methode ist langsamer als die Antwort von Delnan, wenn Sie nur einige von sehr vielen Tasten auswählen möchten.
quelle
if key in ('x','y','z')
denke ich.Sie können dies mit der Projektfunktion aus meiner Funktionsbibliothek tun :
Schauen Sie sich auch select_keys an .
quelle
Code 1:
Code 2:
Code 3:
Alle Teile der Codeleistung werden mit timeit unter Verwendung von number = 1000 gemessen und 1000 Mal für jedes Codeteil gesammelt.
Für Python 3.6 ist die Leistung von drei Filterarten fast gleich. Für Python 2.7 ist Code 3 etwas schneller.
quelle
Dieser einzeilige Lambda sollte funktionieren:
Hier ist ein Beispiel:
Es ist ein grundlegendes Listenverständnis, das über Ihre Diktatschlüssel (i in x) iteriert und eine Liste von Tupelpaaren (Schlüssel, Wert) ausgibt, wenn der Schlüssel in Ihrer gewünschten Schlüsselliste (y) vorhanden ist. Ein dict () umschließt das Ganze, um es als dict-Objekt auszugeben.
quelle
set
für verwendenwanted_keys
, sieht aber sonst gut aus.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
, wird es{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
wie beabsichtigt zurückgegeben.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
und das Ergebnis war{}
, was ich als leeres Diktat annahm.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
, bekomme ich:{'0': [1, 3], '2': [1, 4]}
was das beabsichtigte Ergebnis istAngesichts Ihres Originalwörterbuchs
orig
und der Einträge, an denen Sie interessiert sindkeys
:Das ist nicht so schön wie Delnans Antwort, sollte aber in jeder interessierenden Python-Version funktionieren. Es ist jedoch für jedes Element
keys
in Ihrem ursprünglichen Wörterbuch fragil .quelle
Basierend auf der akzeptierten Antwort von Delnan.
Was ist, wenn einer Ihrer gewünschten Schlüssel nicht im old_dict enthalten ist? Die Delnan-Lösung löst eine KeyError-Ausnahme aus, die Sie abfangen können. Wenn Sie das nicht brauchen, möchten Sie vielleicht:
Fügen Sie nur Schlüssel hinzu, die sowohl im old_dict als auch in Ihrem Satz von want_keys vorhanden sind.
haben einen Standardwert für Schlüssel, der nicht in old_dict festgelegt ist.
quelle
{k: old_dict.get(k, default) for k in ...}
Diese Funktion erledigt den Trick:
Genau wie die Version von Delnan verwendet diese Version das Wörterbuchverständnis und bietet eine stabile Leistung für große Wörterbücher (abhängig nur von der Anzahl der zulässigen Schlüssel und nicht von der Gesamtzahl der Schlüssel im Wörterbuch).
Und genau wie die Version von MyGGan ermöglicht diese Version, dass Ihre Liste von Schlüsseln Schlüssel enthält, die möglicherweise nicht im Wörterbuch vorhanden sind.
Und als Bonus ist hier die Umkehrung, wo Sie ein Wörterbuch erstellen können, indem Sie bestimmte Schlüssel im Original ausschließen:
Beachten Sie, dass der Vorgang im Gegensatz zur Version von delnan nicht an Ort und Stelle ausgeführt wird, sodass die Leistung von der Anzahl der Schlüssel im Wörterbuch abhängt. Dies hat jedoch den Vorteil, dass die Funktion das bereitgestellte Wörterbuch nicht ändert.
Bearbeiten: Es wurde eine separate Funktion zum Ausschließen bestimmter Tasten von einem Diktat hinzugefügt.
quelle
keys
durch jede Art von Iteration zulassen , wie das, was Set akzeptiert.invert
dies, dass daskeys
Argument beibehalten wird oder dass daskeys
Argument zurückgewiesen wird?", Wie viele von ihnen würden zustimmen?Wenn wir ein neues Wörterbuch mit entfernten ausgewählten Schlüsseln erstellen möchten, können wir das Wörterbuchverständnis verwenden.
Zum Beispiel:
quelle
Andere Option:
Sie erhalten jedoch einen
list
(Python 2) oder einen Iterator (Python 3), der von zurückgegeben wirdfilter()
, nicht einendict
.quelle
filtered
eindict
und Sie erhalten das Wörterbuch zurück!Kurzform:
Wie die meisten Antworten vermuten lassen, müssen wir ein doppeltes Objekt erstellen, sei es ein
list
oder , um die Prägnanz aufrechtzuerhaltendict
. Dieser erstellt einen Wegwerfartikellist
, löscht jedoch die Schlüssel im Originaldict
.quelle
Hier ist eine weitere einfache Methode, die
del
in einem Liner verwendet wird:e_keys
ist die Liste der auszuschließenden Schlüssel. Es wird Ihr Diktat aktualisieren, anstatt Ihnen ein neues zu geben.Wenn Sie ein neues Ausgabediktat wünschen, erstellen Sie vor dem Löschen eine Kopie des Diktats:
quelle
Sie könnten verwenden
python-benedict
, es ist eine diktierte Unterklasse.Installation:
pip install python-benedict
Es ist Open Source auf GitHub: https://github.com/fabiocaccamo/python-benedict
Haftungsausschluss: Ich bin der Autor dieser Bibliothek.
quelle