Eine Teilmenge von Schlüssel-Wert-Paaren aus dem Wörterbuch extrahieren?

Lesezeit: 5 Minuten

Benutzeravatar von Jayesh
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?

Das Beste, was ich weiß, ist:

bigdict = {'a':1,'b':2,....,'z':26} 
subdict = {'l':bigdict['l'], 'm':bigdict['m'], 'n':bigdict['n']}

Ich bin sicher, es gibt einen eleganteren Weg als diesen.

Benutzeravatar von Mark Longair
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.

    – Brian Wylie

    7. März 2014 um 22:20 Uhr


  • bigdict.keys() & {'l', 'm', 'n'} ==> bigdict.viewkeys() & {'l', 'm', 'n'} für Python2.7

    – kxr

    25. August 2016 um 15:58 Uhr

  • Was wäre, wenn meine dict ist zu groß?

    – Adamantisch

    17. März 2021 um 22:12 Uhr

Benutzeravatar von Håvard S
Havard S

Wenigstens etwas kürzer:

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


Benutzeravatar von Sklavit
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

Benutzeravatar von theheadofabroom
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

Benutzeravatar von phimuemue
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

Benutzeravatar von Kevin Grimm
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

1436480cookie-checkEine Teilmenge von Schlüssel-Wert-Paaren aus dem Wörterbuch extrahieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy