Wie gebe ich Wörterbuchschlüssel als Liste in Python zurück?

Lesezeit: 6 Minuten

Mit Python 2.7 kann ich Wörterbuch bekommen Schlüssel, Werteoder Artikel Als ein list:

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

Mit Python >= 3.3 bekomme ich:

>>> newdict.keys()
dict_keys([1, 2, 3])

Wie bekomme ich eine Ebene list von Schlüsseln mit Python 3?

  • Ich bin neu in Python und für mich scheint diese Verbreitung nutzloser neuer Datentypen einer der schlimmsten Aspekte von Python zu sein. Welchen Nutzen hat dieser dict_keys-Datentyp? Warum keine Liste?

    – Phil Götz

    9. April 2020 um 20:22 Uhr

  • @PhilGoetz es spart Speicher, indem es eine erstellt Sicht auf das Wörterbuch, das alle Daten des Wörterbuchs verwenden kann, anstatt eine Liste mit beliebig vielen Elementen speichern zu müssen. Es bietet auch einige Mengenoperationen (dh es kann die Tatsache ausnutzen, dass es “weiß”, dass es keine Duplikate enthält), die effizienter sind, als zB die Schnittmenge zweier Listen zu prüfen.

    – Karl Knechtel

    29. August 2022 um 13:08 Uhr


Benutzeravatar von Chris
Chris

Dadurch wird die konvertiert dict_keys widersprechen a list:

list(newdict.keys())

Auf der anderen Seite sollten Sie sich fragen, ob es darauf ankommt oder nicht. Es ist pythonisch anzunehmen EnteneingabeWenn es wie eine Ente aussieht und wie eine Ente quakt, ist es eine Ente. Der dict_keys Objekt kann wie a iteriert werden list. Zum Beispiel:

for key in newdict.keys():
    print(key)

Beachten Sie, dass dict_keys unterstützt das Einfügen nicht newdict[k] = vobwohl Sie es vielleicht nicht brauchen.

  • newdict.keys() unterstützt keine Indizierung

    – Gypaetus

    10. September 2014 um 17:54 Uhr

  • list(newdict) funktioniert auch (zumindest in Python 3.4). Gibt es einen Grund, die zu verwenden .keys() Methode?

    – nichts101

    31. März 2015 um 11:58 Uhr


  • Hinweis: im Debugger pdb> list(newdict.keys()) schlägt fehl, weil es mit dem gleichnamigen Befehl von pdb kollidiert. Verwenden pdb> !list(newdict.keys()) um pdb-Befehle zu entkommen.

    – Riaz Rizvi

    24. Dezember 2016 um 20:37 Uhr

  • @naught101 Ja, .keys() ist viel klarer, was vor sich geht.

    – Felix D.

    27. Mai 2018 um 21:43 Uhr

  • Beachten Sie, dass bei Verwendung von list(newdict.keys()) die Schlüssel aufgrund der Hash-Reihenfolge nicht in der Reihenfolge sind, in der Sie sie platziert haben!

    – Nate M

    30. Januar 2019 um 3:28 Uhr

Benutzeravatar von Dimitris Fasarakis Hilliard
Dimitris Fasarakis Hilliard

Python >= 3.5 alternativ: in ein Listenliteral entpacken [*newdict]

Neu Entpacken von Verallgemeinerungen (PEP 448) wurden mit Python 3.5 eingeführt, sodass Sie jetzt einfach Folgendes tun können:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

Auspacken mit * arbeitet mit beliebig Objekt, das iterierbar ist, und da Wörterbücher ihre Schlüssel zurückgeben, wenn sie durchlaufen werden, können Sie einfach eine Liste erstellen, indem Sie es in einem Listenliteral verwenden.

Hinzufügen .keys() dh [*newdict.keys()] kann helfen, Ihre Absicht etwas deutlicher zu machen, obwohl es Sie eine Funktionssuche und einen Funktionsaufruf kosten wird. (was man ehrlich gesagt nicht tun sollte Wirklich sich Sorgen machen).

Der *iterable Die Syntax ist ähnlich wie beim Ausführen list(iterable) und sein Verhalten wurde zunächst in der dokumentiert Abschnitt “Anrufe”. des Python-Referenzhandbuchs. Bei PEP 448 die Einschränkung wo *iterable erscheinen könnte, wurde gelockert, sodass es auch in Listen-, Satz- und Tupelliteralen platziert werden kann, das Referenzhandbuch weiter Ausdruckslisten wurde ebenfalls aktualisiert, um dies anzugeben.


Obwohl gleichbedeutend mit list(newdict) mit dem Unterschied, dass es (zumindest für kleine Wörterbücher) schneller ist, weil kein Funktionsaufruf tatsächlich ausgeführt wird:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

Bei größeren Wörterbüchern ist die Geschwindigkeit ziemlich gleich (der Aufwand für das Durchlaufen einer großen Sammlung übertrumpft die geringen Kosten eines Funktionsaufrufs).


Auf ähnliche Weise können Sie Tupel und Sätze von Wörterbuchschlüsseln erstellen:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

Vorsicht vor dem abschließenden Komma im Tupelfall!

  • großartige Erklärung, aber können Sie bitte auf einen Link verweisen, der diese Art von Syntax “* newdict” beschreibt, ich meine, wie und warum dies die Schlüssel aus dem Wörterbuch zurückgibt, nur zum Verständnis. Danke

    – Muhammad Younus

    7. April 2018 um 2:56 Uhr


  • @MYounas Diese Syntax ist seit geraumer Zeit verfügbar, sogar in Python 2. In Funktionsaufrufen können Sie dies tun def foo(*args): print(args) gefolgt von foo(*{1:0, 2:0}) mit dem Ergebnis (1, 2) gedruckt wird. Dieses Verhalten ist in der spezifiziert Anrufe Abschnitt des Referenzhandbuchs. Python 3.5 mit PEP 448 hat gerade die Einschränkungen gelockert, wo diese erscheinen dürfen [*{1:0, 2:0}] jetzt zum Einsatz kommen. In jedem Fall werde ich meine Antwort bearbeiten und diese einfügen.

    – Dimitris Fasarakis Hilliard

    7. April 2018 um 10:56 Uhr


  • *newdict – das ist definitiv die Antwort für Code-Golfer ;P. Auch: worüber Sie sich ehrlich gesagt keine Sorgen machen sollten – und wenn ja, Verwenden Sie kein Python.

    – Artemis

    5. April 2019 um 14:26 Uhr


  • Habe heute zwei Dinge gelernt: 1. Ich kann kürzen list(some_dict.keys()) Zu [*some_dict]2. der Ausdruck ‘Code Golfer’ (und 2a. die Bedeutung von ‘Code Golfer’ – nach Googeln)

    – Kasimir

    8. Juli 2020 um 12:16 Uhr

Benutzeravatar von Seb
Seb

list(newdict) funktioniert sowohl in Python 2 als auch in Python 3 und bietet eine einfache Liste der eingegebenen Schlüssel newdict. keys() ist nicht notwendig.

Benutzeravatar von 未来陆家嘴顶尖的投资人
未来陆家嘴顶尖的投资人

Sie können auch eine verwenden Listenverständnis:

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

Oder, kürzer,

>>> [k  for  k in  newdict]
[1, 2, 3]

Hinweis: Für Versionen unter 3.7 wird die Bestellung nicht garantiert (die Bestellung ist immer noch nur ein Implementierungsdetail mit CPython 3.6).

Ein bisschen daneben bei der Definition von “Duck Typing” — dict.keys() gibt ein iterierbares Objekt zurück, kein listenähnliches Objekt. Es funktioniert überall dort, wo ein Iterable funktioniert – nicht überall, wo eine Liste funktioniert. Eine Liste ist auch eine Iterable, aber eine Iterable ist KEINE Liste (oder Sequenz …)

In realen Anwendungsfällen ist das Üblichste, was man mit den Schlüsseln in einem Diktat macht, sie zu durchlaufen, also macht das Sinn. Und wenn Sie sie als Liste brauchen, können Sie anrufen list().

Ganz ähnlich für zip() — in den allermeisten Fällen wird es durchlaufen — warum eine ganze neue Liste von Tupeln erstellen, nur um sie zu durchlaufen und sie dann wieder wegzuwerfen?

Dies ist Teil eines großen Trends in Python, mehr Iteratoren (und Generatoren) zu verwenden, anstatt überall Kopien von Listen.

dict.keys() sollte jedoch mit Verständnis funktionieren – überprüfen Sie sorgfältig auf Tippfehler oder so … es funktioniert gut für mich:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

  • Sie müssen nicht einmal verwenden .keys(); das Dictionary-Objekt ist selbst iterierbar und erzeugt Schlüssel, wenn iteriert wird über: [key.split(", ") for key in d].

    – Martijn Pieters

    27. September 2019 um 12:16 Uhr


Benutzeravatar von Tomerikoo
Tomerikoo

Wenn Sie die Schlüssel separat speichern müssen, finden Sie hier eine Lösung, die weniger Tipparbeit erfordert als jede andere bisher vorgestellte Lösung Erweitertes iterables Entpacken (Python3.x+):

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

Betrieb NEIN. Von Charakteren
k = list(d) 9 Zeichen (ohne Leerzeichen)
k = [*d] 6 Zeichen
*k, = d 5 Zeichen

  • Sie müssen nicht einmal verwenden .keys(); das Dictionary-Objekt ist selbst iterierbar und erzeugt Schlüssel, wenn iteriert wird über: [key.split(", ") for key in d].

    – Martijn Pieters

    27. September 2019 um 12:16 Uhr


Benutzeravatar von Dimitris Fasarakis Hilliard
Dimitris Fasarakis Hilliard

Konvertieren in eine Liste ohne Verwendung der keys Methode macht es lesbarer:

list(newdict)

und beim Durchsuchen von Wörterbüchern besteht keine Notwendigkeit für keys():

for key in newdict:
    print key

es sei denn, Sie ändern es innerhalb der Schleife, was eine zuvor erstellte Liste von Schlüsseln erfordern würde:

for key in list(newdict):
    del newdict[key]

Auf Python 2 gibt es einen marginalen Leistungsgewinn mit keys().

1449190cookie-checkWie gebe ich Wörterbuchschlüssel als Liste in Python zurück?

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

Privacy policy