1265 Stimmen

Wie kann ich in Python die Schlüssel eines Wörterbuchs als Liste zurückgeben?

Mit Python 2.7 kann ich Wörterbuch Schlüssel, Werte oder Items als eine Liste erhalten:

>>> 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 erhalte ich eine einfache Liste von Schlüsseln mit Python 3?

1567voto

Chris Punkte 15996

Dies wird das Objekt dict_keys in eine Liste umwandeln:

list(newdict.keys())

Andererseits sollten Sie sich fragen, ob es wichtig ist oder nicht. Es ist pythonisch anzunehmen Duck-Typing - wenn es wie eine Ente aussieht und wie eine Ente quakt, ist es eine Ente. Das Objekt dict_keys kann genauso wie eine Liste iteriert werden. Zum Beispiel:

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

Beachten Sie, dass dict_keys keine Einfügung unterstützt newdict[k] = v, obwohl Sie es vielleicht nicht brauchen.

513voto

Python >= 3.5 Alternative: Entpacken in ein Listenliteral [*newdict]

Neue Entpackungsverallgemeinerungen (PEP 448) wurden mit Python 3.5 eingeführt, was es Ihnen jetzt leicht ermöglicht:

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

Das Entpacken mit * funktioniert mit jedem Objekt, das durchlaufen werden kann und da Dictionaries ihre Schlüssel zurückgeben, wenn sie durchlaufen werden, können Sie leicht eine Liste erstellen, indem Sie es in ein Listenliteral einfügen.

Das Hinzufügen von .keys() z.B. [*newdict.keys()] könnte dazu beitragen, Ihre Absicht etwas expliziter zu machen, obwohl es einen Funktionsaufruf und eine -aufruf kostet. (was ehrlich gesagt etwas ist, worüber Sie sich wirklich keine Sorgen machen sollten).

Die Syntax <code>iterable</code> ist ähnlich wie <code>list(iterable)</code> und ihr Verhalten wurde ursprünglich im <a href="https://docs.python.org/3/reference/expressions.html#calls" rel="noreferrer">Abschnitt Calls</a> des Python-Referenzhandbuchs dokumentiert. Mit PEP 448 wurde die Einschränkung, wo <code>iterable</code> erscheinen konnte, gelockert, sodass es auch in Listen-, Set- und Tuple-Literalen platziert werden konnte, das Referenzhandbuch zu <a href="https://docs.python.org/3/reference/expressions.html#expression-lists" rel="noreferrer">Expression-Listen</a> wurde ebenfalls aktualisiert, um dies festzustellen.


Obwohl äquivalent zu list(newdict) mit dem Unterschied, dass es schneller ist (zumindest für kleine Dictionaries), weil kein Funktionsaufruf tatsächlich durchgeführt wird:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns pro Schleife

%timeit list(newdict)
1000000 loops, best of 3: 508 ns pro Schleife

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

Bei größeren Dictionaries ist die Geschwindigkeit ziemlich gleich (der Overhead beim Durchlaufen einer großen Sammlung übertrifft die geringen Kosten eines Funktionsaufrufs).


Auf ähnliche Weise können Sie Tupel und Sets von Schlüsseln eines Dictionaries erstellen:

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

vorsichtig mit dem nachgestellten Komma im Falle des Tupels!

70voto

Seb Punkte 811

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

37voto

Sie können auch eine List-Comprehension verwenden:

>>> 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: Die Reihenfolge ist nicht garantiert in Versionen unter 3.7 (die Reihenfolge ist immer noch nur ein Implementierungsdetail bei CPython 3.6).

30voto

Chris Barker Punkte 539

Etwas daneben mit 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 dort, wo eine Liste funktioniert. Eine Liste ist auch ein Iterable, aber ein Iterable ist KEIN (oder Sequenz...) Liste.

In realen Anwendungsfällen ist es am häufigsten, durch die Schlüssel in einem Dictionary zu iterieren, also macht dies Sinn. Und wenn Sie sie wirklich als Liste benötigen, können Sie list() aufrufen.

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

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

dict.keys() sollte mit Comprehensions funktionieren, jedoch - achten Sie sorgfältig auf Tippfehler oder etwas... 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']]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X