Ich habe ein Wörterbuch:
{'key1':1, 'key2':2, 'key3':3}
Ich muss einen Teil dieses Wörterbuchs an Code von Drittanbietern übergeben. Es möchte nur ein Wörterbuch, das Schlüssel enthält, ['key1', 'key2', 'key99']
und wenn es einen anderen Schlüssel erhält (z. B. 'key3'
), explodiert es in einem bösen Durcheinander. Der betreffende Code liegt außerhalb meiner Kontrolle, sodass ich in einer Position bin, in der ich mein Wörterbuch bereinigen muss.
Was ist der beste Weg, um ein Wörterbuch auf einen Satz von Schlüsseln zu beschränken?
Angesichts des obigen Beispielwörterbuchs und der zulässigen Schlüssel möchte ich:
{'key1':1, 'key2':2}
python
dictionary
Oli
quelle
quelle
adict - {'key1'} == {'key2':2, 'key3':3}
dict.update
Methode zu geben{k: v for k, v in adict.items() if k in new_keys}
vs.{k:adict[k] for k in new_keys if k in adict}
. Stehen wir in letzterem Fall nicht vor einem ähnlichen Problem, wenn new_keys groß ist?dict(filter(lambda i:i[0] in validkeys, d.iteritems()))
quelle
d.items()
.Verwenden Sie in modernem Python (2.7 +, 3.0 +) ein Wörterbuchverständnis:
d = {'key1':1, 'key2':2, 'key3':3} included_keys = ['key1', 'key2', 'key99'] {k:v for k,v in d.items() if k in included_keys}
quelle
len(d) >> len(included_keys)
(>>
bedeutet "viel größer"). Aber ich denke im allgemeinen Fall ist len (d) nicht sehr groß ...Eine andere Lösung ohne diktiertes Verständnis.
>>> a = {'key1':1, 'key2':2, 'key3':3} >>> b = {'key1':1, 'key2':2} >>> { k:a[k] for k in b.keys()} {'key2': 2, 'key1': 1}
quelle
Mein Weg dies zu tun ist.
from operator import itemgetter def subdict(d, ks): return dict(zip(ks, itemgetter(*ks)(d))) my_dict = {'key1':1, 'key2':2, 'key3':3} subdict(my_dict, ['key1', 'key3'])
Aktualisieren
Ich muss allerdings zugeben, dass die obige Implementierung den Fall nicht behandelt, wenn die Länge
ks
0 oder 1 ist. Der folgende Code behandelt die Situation und ist kein Einzeiler mehr.def subdict(d, ks): vals = [] if len(ks) >= 1: vals = itemgetter(*ks)(d) if len(ks) == 1: vals = [vals] return dict(zip(ks, vals))
quelle
from operator import itemgetter as ig
ein bisschen horizontalen Zeilenraum sparen und tippen. Ich glaube nicht, dass ich mich daran erinnerte, dassitemgetter
mehrere Gegenstände zum Abrufen benötigt würden. Tolle Erinnerung, danke!Mit einer komplexen Klasse
Myclass
als Unterklasse voncollections.UserDict
. Um eine Teilmenge davon auszuwählen, dh alle Containereigenschaften beizubehalten, ist es zweckmäßig, eine Methode zu definieren, z. B.sub
wie folgt benannt:def sub(self, keys): subset = Myclass() # no arguments; works if defined with only keyword arguments for key in keys: subset[key] = self[key] return subset
Es wird dann verwendet als
Myclass.sub([key1, key2 ...]
)quelle