Eine Teilmenge von Schlüssel-Wert-Paaren aus dem Wörterbuch extrahieren?
Lesezeit: 5 Minuten
Jayesh
Ich habe ein großes Wörterbuchobjekt mit mehreren Schlüsselwertpaaren (ca. 16), aber ich interessiere mich nur für 3 davon. Was ist der beste Weg (am kürzesten/effizientesten/elegantesten), um ein solches Wörterbuch zu unterteilen?
Ich bin sicher, es gibt einen eleganteren Weg als diesen.
Markus Longair
Du könntest es versuchen:
dict((k, bigdict[k]) for k in ('l', 'm', 'n'))
… oder drin Python 3 Python-Versionen 2.7 oder höher (danke an Fábio Diniz für den Hinweis, dass es auch in 2.7 funktioniert):
{k: bigdict[k] for k in ('l', 'm', 'n')}
Update: Wie Håvard S betont, gehe ich davon aus, dass Sie wissen, dass die Schlüssel im Wörterbuch stehen werden – sehen Sie sich seine Antwort an, wenn Sie diese Annahme nicht treffen können. Alternativ, wie Timbo in den Kommentaren betont, wenn Sie einen fehlenden Schlüssel wünschen bigdict zuzuordnen Nonedu kannst tun:
{k: bigdict.get(k, None) for k in ('l', 'm', 'n')}
Wenn Sie Python 3 verwenden, und Sie nur Wenn Sie Schlüssel im neuen Diktat haben möchten, die tatsächlich im ursprünglichen Diktat vorhanden sind, können Sie die Tatsache verwenden, dass Objekte angezeigt werden, die einige Set-Operationen implementieren:
{k: bigdict[k] for k in bigdict.keys() & {'l', 'm', 'n'}}
Wird scheitern, wenn bigdict beinhaltet nicht k
– Håvard S
18. März 2011 um 13:29 Uhr
{k: bigdict.get(k,None) for k in ('l', 'm', 'n')} wird die Situation behandeln, in der ein bestimmter Schlüssel im Quellwörterbuch fehlt, indem der Schlüssel im neuen Diktat auf None gesetzt wird
– Timbo
21. Dezember 2013 um 22:44 Uhr
@MarkLongair Je nach Anwendungsfall {k: bigdict[k] for k in (‘l’,’m’,’n’) if k in bigdict} könnte besser sein, da es nur die Schlüssel speichert, die tatsächlich Werte haben.
wanted_keys = ['l', 'm', 'n'] # The keys you want
dict((k, bigdict[k]) for k in wanted_keys if k in bigdict)
+1 für alternatives Verhalten zum Ausschließen eines Schlüssels, wenn er nicht in Bigdict ist, im Gegensatz zum Setzen auf None.
– dhj
12. Juni 2014 um 18:35 Uhr
Alternative: dict((k,bigdict.get(k,defaultVal) for k in wanted_keys) wenn Sie alle Schlüssel haben müssen.
– Thomas Andreas
1. Mai 2018 um 20:57 Uhr
Diese Antwort wird durch ein „t“ gespeichert.
– sakurashinken
29. Mai 2019 um 7:42 Uhr
Auch eine etwas kürzere Variante (Syntax) deiner Lösung ist bei Verwendung {}dh {k: bigdict[k] for k in wanted_keys if k in bigdict}
– Arti
4. Oktober 2021 um 3:42 Uhr
Sklavit
Ein kleiner Geschwindigkeitsvergleich für alle genannten Methoden:
AKTUALISIERT am 13.07.2020 (danke an @user3780389): NUR für Schlüssel von bigdict.
IPython 5.5.0 -- An enhanced Interactive Python.
Python 2.7.18 (default, Aug 8 2019, 00:00:00)
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux2
import numpy.random as nprnd
...: keys = nprnd.randint(100000, size=10000)
...: bigdict = dict([(_, nprnd.rand()) for _ in range(100000)])
...:
...: %timeit {key:bigdict[key] for key in keys}
...: %timeit dict((key, bigdict[key]) for key in keys)
...: %timeit dict(map(lambda k: (k, bigdict[k]), keys))
...: %timeit {key:bigdict[key] for key in set(keys) & set(bigdict.keys())}
...: %timeit dict(filter(lambda i:i[0] in keys, bigdict.items()))
...: %timeit {key:value for key, value in bigdict.items() if key in keys}
100 loops, best of 3: 2.36 ms per loop
100 loops, best of 3: 2.87 ms per loop
100 loops, best of 3: 3.65 ms per loop
100 loops, best of 3: 7.14 ms per loop
1 loop, best of 3: 577 ms per loop
1 loop, best of 3: 563 ms per loop
Wie erwartet: Wörterbuchverständnis ist die beste Option.
Die ersten 3 Operationen machen etwas anderes als die letzten beiden und führen zu einem Fehler, wenn key existiert nicht in bigdict.
– nichts101
19. Juni 2020 um 1:56 Uhr
Hübsch. vielleicht eine Ergänzung wert {key:bigdict[key] for key in bigdict.keys() & keys} von der akzeptierten Lösung, die den Filter durchführt, während sie (auf meinem Computer) tatsächlich schneller ist als die erste Methode, die Sie auflisten, die nicht filtert. In der Tat, {key:bigdict[key] for key in set(keys) & set(bigdict.keys())} scheint für diese sehr großen Schlüsselsätze noch schneller zu sein …
– teichert
8. Juli 2020 um 18:30 Uhr
@telchert dir fehlt, dass im Geschwindigkeitsvergleich bigdict.keys() & key nicht gesetzt sind. Und mit expliziter Konvertierung in Sätze akzeptierte Lösung ist nicht so schnell.
– Sklavit
18. Oktober 2021 um 13:58 Uhr
der Kopf des Besens
interesting_keys = ('l', 'm', 'n')
subdict = {x: bigdict[x] for x in interesting_keys if x in bigdict}
Diese Antwort verwendet ein ähnliches Wörterbuchverständnis wie die ausgewählte Antwort, wird jedoch kein fehlendes Element ausschließen.
Python-2-Version:
{k:v for k, v in bigDict.iteritems() if k in ('l', 'm', 'n')}
Python-3-Version:
{k:v for k, v in bigDict.items() if k in ('l', 'm', 'n')}
… aber wenn das große Diktat RIESIG ist, wird es immer noch vollständig durchlaufen (dies ist eine O (n) -Operation), während die Umkehrung nur 3 Elemente greifen würde (jeweils eine O (1) -Operation).
– wouter bolsterlee
5. Oktober 2015 um 16:08 Uhr
Die Frage bezieht sich auf ein Wörterbuch mit nur 16 Tasten
– Miau
6. Oktober 2015 um 17:09 Uhr
phimuemue
Vielleicht:
subdict=dict([(x,bigdict[x]) for x in ['l', 'm', 'n']])
Python 3 unterstützt sogar Folgendes:
subdict={a:bigdict[a] for a in ['l','m','n']}
Beachten Sie, dass Sie das Vorhandensein im Wörterbuch wie folgt überprüfen können:
subdict=dict([(x,bigdict[x]) for x in ['l', 'm', 'n'] if x in bigdict])
bzw. für Python3
subdict={a:bigdict[a] for a in ['l','m','n'] if a in bigdict}
… aber wenn das große Diktat RIESIG ist, wird es immer noch vollständig durchlaufen (dies ist eine O (n) -Operation), während die Umkehrung nur 3 Elemente greifen würde (jeweils eine O (1) -Operation).
– wouter bolsterlee
5. Oktober 2015 um 16:08 Uhr
Die Frage bezieht sich auf ein Wörterbuch mit nur 16 Tasten
– Miau
6. Oktober 2015 um 17:09 Uhr
Kevin Grimm
Ein alternativer Ansatz, wenn Sie die Mehrheit der Schlüssel behalten und einige entfernen möchten:
{k: bigdict[k] for k in bigdict.keys() if k not in ['l', 'm', 'n']}
Noch kürzer: {k: v for k, v in bigdict.items() if k not in ['l', 'm', 'n']}
– pierresegonne
11. Oktober 2021 um 13:42 Uhr
14364800cookie-checkEine Teilmenge von Schlüssel-Wert-Paaren aus dem Wörterbuch extrahieren?yes