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
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 Enteneingabe — Wenn 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
Dimitris Fasarakis Hilliard
Python >= 3.5 alternativ: in ein Listenliteral entpacken[*newdict]
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
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.
未来陆家嘴顶尖的投资人
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
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+):
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
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().
14491900cookie-checkWie gebe ich Wörterbuchschlüssel als Liste in Python zurück?yes
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