In Python 2.7 , konnte ich Wörterbuch erhalten Schlüssel , Werte oder Elemente als Liste:
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
In Python> = 3.3 erhalte ich ungefähr Folgendes:
>>> newdict.keys()
dict_keys([1, 2, 3])
Also muss ich das tun, 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 3 zurückzugeben ?
python
python-3.x
list
dictionary
python-2.x
Dimitris Fasarakis Hilliard
quelle
quelle
Antworten:
Versuchen Sie es
list(newdict.keys())
.Dadurch wird das
dict_keys
Objekt in eine Liste konvertiert .Auf der anderen Seite sollten Sie sich fragen, ob es wichtig ist oder nicht. Die pythonische Art zu codieren besteht darin, die Ententypisierung anzunehmen ( wenn es wie eine Ente aussieht und wie eine Ente quakt, ist es eine Ente ). Das
dict_keys
Objekt verhält sich für die meisten Zwecke wie eine Liste. Zum Beispiel:Einfügeoperatoren funktionieren natürlich möglicherweise nicht, aber das macht für eine Liste von Wörterbuchschlüsseln sowieso nicht viel Sinn.
quelle
list(newdict)
funktioniert auch (zumindest in Python 3.4). Gibt es einen Grund, die.keys()
Methode anzuwenden ?pdb> list(newdict.keys())
schlägt fehl, da er mit dem gleichnamigen Befehl von pdb kollidiert. Verwenden Siepdb> !list(newdict.keys())
diese Option, um pdb-Befehlen zu entkommen..keys()
ist viel klarer, was los ist.Python> = 3.5 Alternative: In ein Listenliteral entpacken
[*newdict]
Mit Python 3.5 wurden neue Verpackungsverallgemeinerungen (PEP 448) eingeführt, mit denen Sie jetzt ganz einfach Folgendes tun können:
Das Entpacken mit
*
funktioniert mit jedem iterierbaren Objekt. 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()
dh kann[*newdict.keys()]
dazu beitragen, Ihre Absicht ein wenig deutlicher zu machen, obwohl es Sie eine Funktionssuche und einen Aufruf kostet. (worüber Sie sich ehrlich gesagt keine Sorgen machen sollten).Die
*iterable
Syntax ähnelt der von Doinglist(iterable)
und ihr Verhalten wurde ursprünglich in der Dokumentation dokumentiert Abschnitt Aufrufe des Python-Referenzhandbuchs dokumentiert. Mit PEP 448 wurde die Beschränkung, wo*iterable
angezeigt werden kann, gelockert, sodass es auch in Listen-, Set- und Tupelliterale eingefügt werden kann. Das Referenzhandbuch zu Ausdruckslisten wurde ebenfalls aktualisiert, um dies anzugeben.Obwohl gleichbedeutend
list(newdict)
mit dem Unterschied, dass es schneller ist (zumindest für kleine Wörterbücher), weil tatsächlich kein Funktionsaufruf ausgeführt wird:Bei größeren Wörterbüchern ist die Geschwindigkeit nahezu gleich (der Aufwand für das Durchlaufen einer großen Sammlung übertrifft die geringen Kosten eines Funktionsaufrufs).
Auf ähnliche Weise können Sie Tupel und Sätze von Wörterbuchschlüsseln erstellen:
Achten Sie auf das nachfolgende Komma im Tupelgehäuse!
quelle
def foo(*args): print(args)
durch gefolgtfoo(*{1:0, 2:0})
mit dem Ergebnis(1, 2)
gedruckt wird. Dieses Verhalten wird im Abschnitt Anrufe des Referenzhandbuchs angegeben. Python 3.5 mit PEP 448 hat gerade die Einschränkungen gelockert, wo diese angezeigt werden können, sodass[*{1:0, 2:0}]
sie jetzt verwendet werden können. In jedem Fall werde ich meine Antwort bearbeiten und diese einschließen.*newdict
- Dies ist definitiv die Antwort für Code-Golfer; P. Außerdem: Worüber Sie sich ehrlich gesagt keine Sorgen machen sollten - und wenn ja , verwenden Sie kein Python .list(newdict)
funktioniert sowohl in Python 2 als auch in Python 3 und bietet eine einfache Liste der Schlüssel innewdict
.keys()
ist nicht notwendig. (:quelle
Ein bisschen abweichend von der Definition der "Ententypisierung" -
dict.keys()
gibt ein iterierbares Objekt zurück, kein listenähnliches Objekt. Es wird überall dort funktionieren, wo eine Iterable 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 ist es am häufigsten, die Schlüssel in einem Diktat zu durchlaufen, um sie zu durchlaufen. Dies ist also sinnvoll. Und wenn Sie sie als Liste benötigen, können Sie anrufen
list()
.Ganz ähnlich, denn
zip()
- in den allermeisten Fällen wird es durchlaufen - warum sollte eine ganz neue Liste von Tupeln erstellt werden, um sie zu durchlaufen und dann wieder wegzuwerfen?Dies ist Teil eines großen Trends in Python, mehr Iteratoren (und Generatoren) anstelle von Kopien von Listen überall zu verwenden.
dict.keys()
sollte aber mit Verständnis funktionieren - sorgfältig auf Tippfehler oder ähnliches prüfen ... es funktioniert gut für mich:quelle
.keys()
; Das Wörterbuchobjekt ist selbst iterierbar und erzeugt Schlüssel, wenn es wiederholt wird :[key.split(", ") for key in d]
.Sie können auch ein Listenverständnis verwenden :
Oder kürzer,
Hinweis: Die Reihenfolge ist bei Versionen unter 3.7 nicht garantiert (die Bestellung ist bei CPython 3.6 immer noch nur ein Implementierungsdetail).
quelle
list(newdict)
. Hier ist kein Listenverständnis erforderlich.Das Konvertieren in eine Liste ohne Verwendung der
keys
Methode macht sie besser lesbar:und beim Durchlaufen von Wörterbüchern ist Folgendes nicht erforderlich
keys()
:es sei denn, Sie ändern es innerhalb der Schleife, für die eine Liste der zuvor erstellten Schlüssel erforderlich wäre:
Unter Python 2 gibt es einen geringfügigen Leistungsgewinn bei Verwendung von
keys()
.quelle
Wenn Sie die Schlüssel separat speichern müssen, finden Sie hier eine Lösung, die weniger Eingabe erfordert als jede andere bisher vorgestellte Lösung, die Extended Iterable Unpacking (python3.x +) verwendet.
quelle
k
es hier immer eine Liste gibt. Wenn ein Benutzer ein Tupel oder eine Einstellung über die Tasten wünscht, muss er auf die anderen Optionen zurückgreifen.*k, = d
Einschränkungen aufweist, wo sie angezeigt werden kann (siehe jedoch und aktualisieren Sie möglicherweise diese Antwort für PEP 572 - erweitertes Entpacken wird für Zuweisungsausdrücke atm nicht unterstützt , könnte aber eines Tages sein! )keys, vals = zip(*d.items())
(obwohl das zwei Tupel gibt, nah genug). Ich kenne keinen kürzeren Ausdruck als diesen.Ich kann mir zwei Möglichkeiten vorstellen, wie wir die Schlüssel aus dem Wörterbuch extrahieren können.
Methode 1: - Um die Schlüssel mit der .keys () -Methode abzurufen und dann in eine Liste zu konvertieren.
Methode 2: - Erstellen einer leeren Liste und Anhängen von Schlüsseln an die Liste über eine Schleife. Sie können die Werte auch mit dieser Schleife abrufen (verwenden Sie .keys () nur für Schlüssel und .items () für die Schlüssel- und Wertextraktion).
quelle