web-dev-qa-db-de.com

Wie kann ich Wörterbuchschlüssel in Python als Liste zurückgeben?

In Python 2.7 konnte ich das Wörterbuch Schlüssel, Werte oder Elemente als Liste erhalten:

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

In Python> = 3. erhalte ich ungefähr Folgendes:

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

Also muss ich das machen, um eine Liste zu bekommen:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

Ich frage mich, gibt es eine bessere Möglichkeit, eine Liste in Python zurückzugeben?

587
user2015601

Versuchen Sie list(newdict.keys()).

Dadurch wird das Objekt dict_keys in eine Liste konvertiert.

Auf der anderen Seite sollten Sie sich fragen, ob es darauf ankommt oder nicht. Die pythonische Art des Codierens ist die Annahme, dass Enten tippen (wenn es wie eine Ente aussieht und wie eine Ente quakt, ist es eine Ente). Das Objekt dict_keys verhält sich für die meisten Zwecke wie eine Liste. Zum Beispiel:

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

Einfügeoperatoren funktionieren möglicherweise nicht, aber das ist für eine Liste von Wörterbuchschlüsseln sowieso nicht sehr sinnvoll.

744
Chris

Python> = 3.5 Alternative: In ein Listenliteral entpacken [*newdict]

Mit Python 3.5 wurden neue Auspacken von Generalisierungen (PEP 448) eingeführt, mit denen Sie jetzt einfach Folgendes tun können:

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

Das Entpacken mit * funktioniert mit jedem Objekt, das iteriert werden kann. Da Wörterbücher ihre Schlüssel beim Durchlaufen zurückgeben, können Sie eine Liste einfach erstellen, indem Sie sie in einem Listenliteral verwenden .

Das Hinzufügen von .keys(), d. H. [*newdict.keys()], kann dazu beitragen, dass Ihre Absicht ein bisschen expliziter wird, obwohl Sie eine Funktionssuche und einen Funktionsaufruf kosten. (was, ganz ehrlich, nichts ist, worüber Sie sich wirklich Sorgen machen sollten).

Die Syntax von *iterable ähnelt der von list(iterable), und ihr Verhalten wurde ursprünglich im Abschnitt Calls des Referenzhandbuchs Python dokumentiert. Mit PEP 448 wurde die Einschränkung, wo *iterable auftreten könnte, gelockert, sodass es auch in Listen-, Mengen- und Tupelliteralen platziert werden kann. Das Referenzhandbuch zu Ausdruckslisten wurde ebenfalls aktualisiert, um dies anzugeben.


Entspricht zwar list(newdict) mit dem Unterschied, dass es schneller ist (zumindest für kleine Wörterbücher), da tatsächlich kein Funktionsaufruf 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 übersteigt 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}

achten Sie auf das nachstehende Komma im Tupel-Fall!

190

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

30
Seb

Ein wenig abweichend von der Definition für "duck typing" - dict.keys() gibt ein iterierbares Objekt zurück, kein listenartiges Objekt. Es wird überall funktionieren, wo ein iterables funktioniert - nicht an jedem Ort, an dem eine Liste funktioniert. Eine Liste ist auch eine iterable, aber eine iterable ist keine Liste (oder Sequenz ...)

In realen Anwendungsfällen müssen die Schlüssel in einem Diktat am häufigsten durchlaufen werden. Dies ist also sinnvoll. Und wenn Sie sie als Liste benötigen, können Sie list() aufrufen.

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

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

dict.keys() sollte jedoch mit Verständnis funktionieren - prüfen Sie sorgfältig auf Tippfehler oder ähnliches ... für mich funktioniert es einwandfrei:

>>> 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']]
23
Chris Barker

Sie können auch ein Listenverständnis 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: Bei Versionen unter 3.7 kann die Bestellung nicht garantiert werden (die Bestellung ist bei CPython 3.6 immer noch nur ein Implementierungsdetail).

Das Konvertieren in eine Liste ohne die keys Methode macht es lesbarer:

list(newdict)

und beim Durchlaufen von Wörterbüchern ist keys() nicht erforderlich:

for key in newdict:
    print key

es sei denn, Sie ändern es in der Schleife, für die zuvor eine Liste von Schlüsseln erstellt werden müsste:

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

Auf Python 2 gibt es einen geringfügigen Leistungszuwachs mit keys().

7
Cas

Wenn Sie die Schlüssel separat speichern müssen, ist hier eine Lösung, bei der weniger Eingaben erforderlich sind als bei jeder anderen bisher vorgestellten Lösung, bei der Extended Iterable Unpacking (python3.x +) verwendet wird.

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

k
# [1, 2, 3]

            ╒═══════════════╤═════════════════════════════════════════╕
            │ k = list(d)   │   9 characters (excluding whitespace)   │
            ├───────────────┼─────────────────────────────────────────┤
            │ k = [*d]      │   6 characters                          │
            ├───────────────┼─────────────────────────────────────────┤
            │ *k, = d       │   5 characters                          │
            ╘═══════════════╧═════════════════════════════════════════╛
6
cs95

Sie können auch Tuple(dict) oder set(dict) ausführen:

>>> list(set(newdict))
[1, 2, 3]
>>> list(Tuple(newdict))
[1, 2, 3]
2
SuperNova
list(newdict)

Dies ist die einfachste Lösung und hat wie ein Zauber gewirkt!

2
Muhammad Haseeb

Anders als auf dieser Seite erwähnt, können Sie itemgetter vom Bedienermodul aus verwenden:

>>> from operator import itemgetter
>>> list(map(itemgetter(0), dd.items()))
[1, 2, 3]
1
SuperNova

list (newdict.keys ())

list(newdict.keys())
0
Sat110