HOWTO · Python

Wie man die Schlüssel eines Python-Dictionarys als Liste erhält

So erhalten Sie die Schlüssel eines Python-Dictionarys mit list(), einer Schleife, einer List Comprehension oder Entpacken als Liste und unterscheiden eine dict_keys-Ansicht von einer Liste.

Auf dieser Seite

Um die Schlüssel eines Python-Dictionarys als Liste zu erhalten, verwenden Sie list(my_dict). list(my_dict.keys()) liefert dieselbe Liste. Der Konstruktor list() sammelt in beiden Fällen die Schlüssel in einer neuen Liste. Dagegen gibt die Methode my_dict.keys() allein eine dict_keys-Ansicht zurück: Über sie können Sie iterieren, aber Sie können nicht wie bei einer Liste per Index auf ihre Elemente zugreifen. Wandeln Sie die Schlüssel um, wenn Sie tatsächlich ein Listenobjekt benötigen; andernfalls genügt es meist, direkt über das Dictionary zu iterieren.

Schlüssel eines Python-Dictionarys mit dict.keys() abrufen

Die Methode dict.keys() gibt eine Ansicht der aktuellen Schlüssel zurück. Änderungen am Dictionary werden in dieser Ansicht sichtbar. Eine daraus erzeugte Liste ist dagegen eine eigenständige Momentaufnahme. Seit Python 3.7 entspricht die Iterationsreihenfolge eines Dictionarys der Einfügereihenfolge; die folgende Ausgabe setzt dieses Verhalten voraus.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys_view = state_capitals.keys()
print(keys_view)
for state in keys_view:
    print(state)

keys_list = list(keys_view)
print(keys_list)
print(list(state_capitals))
print(keys_list[0])

state_capitals["Nevada"] = "Carson City"
print(list(keys_view))
print(keys_list)
dict_keys(['California', 'Pennsylvania', 'Texas'])
California
Pennsylvania
Texas
['California', 'Pennsylvania', 'Texas']
['California', 'Pennsylvania', 'Texas']
California
['California', 'Pennsylvania', 'Texas', 'Nevada']
['California', 'Pennsylvania', 'Texas']

Sowohl list(keys_view) als auch list(state_capitals) erzeugen eine Liste. Letzteres funktioniert, weil die Iteration über ein Dictionary dessen Schlüssel liefert. Ein Indexzugriff auf die Ansicht selbst löst einen TypeError aus. Bei einem leeren Dictionary ergibt die Umwandlung []; ein Indexzugriff auf diese leere Liste löst einen IndexError aus.

Schlüssel eines Python-Dictionarys mit einer Schleife sammeln

Eine ausdrückliche Schleife ist sinnvoll, wenn Sie jeden Schlüssel beim Sammeln zusätzlich verarbeiten möchten. Verwenden Sie for key in state_capitals: Das Schlüsselwort in ist erforderlich, und die Schleife liefert Schlüssel statt Werte.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys = []
for key in state_capitals:
    keys.append(key)
print(keys)
['California', 'Pennsylvania', 'Texas']

Bei einem leeren Dictionary wird der Schleifenrumpf nicht ausgeführt und keys bleibt leer. Wenn Sie die Schlüssel lediglich sammeln möchten, ist list(state_capitals) kürzer.

Schlüssel eines Python-Dictionarys mit einer List Comprehension sammeln

Mit einer List Comprehension lässt sich dieselbe Sammelschleife in einer Zeile ausdrücken. Diese Form eignet sich, wenn Sie später Schlüssel filtern oder jeden Schlüssel umformen möchten. Für eine unveränderte Kopie ist der Listenkonstruktor einfacher.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys = [key for key in state_capitals]
print(keys)
['California', 'Pennsylvania', 'Texas']

Auch diese List Comprehension ergibt bei einem leeren Dictionary [].

Schlüssel eines Python-Dictionarys mit dem Operator * entpacken

Mit der Entpackungssyntax * können Sie die Schlüssel eines Dictionarys in ein Listenliteral einfügen: [*state_capitals]. PEP 448 hat das Entpacken in Python 3.5 verallgemeinert. Diese historische Versionsangabe beruht auf der Sprachspezifikation; der Code wurde hier nicht unter Python 3.5 ausgeführt. Das Entpacken funktioniert auch in Tupel- und Mengenliteralen.

state_capitals = {
    "California": "Sacramento",
    "Pennsylvania": "Harrisburg",
    "Texas": "Austin",
}

keys_list = [*state_capitals]
keys_tuple = (*state_capitals,)
keys_set = {*state_capitals}
print(keys_list)
print(keys_tuple)
print(sorted(keys_set))
['California', 'Pennsylvania', 'Texas']
('California', 'Pennsylvania', 'Texas')
['California', 'Pennsylvania', 'Texas']

Eine Menge entfernt doppelte Elemente und hat keine zugesicherte Anzeigereihenfolge. sorted() macht die gezeigte Ausgabe vorhersehbar. Das Tupel und die Liste bewahren seit Python 3.7 die Iterationsreihenfolge des Dictionarys. Verwenden Sie die Listenform, wenn das Ergebnis tatsächlich eine Liste sein muss.

Laufzeiten vergleichen

Wenn die Geschwindigkeit der Umwandlung wichtig ist, messen Sie mit Ihrem Python-Interpreter und einem Dictionary, dessen Größe Ihren tatsächlichen Daten ähnelt. Das folgende Skript gibt die Python-Version und den besten Wert aus fünf Messungen aus. Jede Messung führt 10.000 Umwandlungen desselben Dictionarys mit 100 Einträgen aus. Jeder gemessene Ausdruck erzeugt eine neue Liste; auch die Schleife legt für jede Umwandlung eine neue Zielliste an.

import platform
from timeit import repeat

state_capitals = {str(number): number for number in range(100)}
methods = {
    "list(d.keys())": "list(state_capitals.keys())",
    "list(d)": "list(state_capitals)",
    "loop": "keys = []\nfor key in state_capitals:\n    keys.append(key)",
    "comprehension": "[key for key in state_capitals]",
    "unpacking": "[*state_capitals]",
}

print("Python", platform.python_version())
for name, statement in methods.items():
    times = repeat(statement, globals=globals(), number=10_000, repeat=5)
    print(f"{name}: {min(times) / 10_000:.9f} seconds per conversion")

Die gemessenen Zeiten hängen vom Interpreter, vom Rechner und von der Größe des Dictionarys ab. Daher gibt es weder eine feste Ausgabe noch eine Methode, die immer am schnellsten ist. Für gewöhnlichen Code ist list(state_capitals) eine gut lesbare Wahl. Vergleichen Sie Alternativen per Messung, wenn die Umwandlung in Ihrem Programm spürbar Zeit kostet.