HOWTO · Python

Cómo obtener las claves de un diccionario como una lista en Python

Obtén las claves de un diccionario de Python como una lista con list(), bucles, comprensiones o desempaquetado, y descubre en qué se diferencia una vista dict_keys de una lista.

En esta página

Para obtener las claves de un diccionario de Python como una lista, usa list(my_dict). list(my_dict.keys()) produce la misma lista. El constructor list(), presente en ambas expresiones, reúne las claves en una lista nueva. En cambio, el método my_dict.keys() por sí solo devuelve una vista dict_keys: puedes recorrerla, pero no acceder a sus elementos mediante índices como harías con una lista. Convierte las claves cuando necesites una lista; si solo vas a recorrerlas, normalmente basta con iterar sobre el diccionario.

Obtener las claves de un diccionario con dict.keys()

El método dict.keys() devuelve una vista de las claves actuales. La vista refleja los cambios posteriores del diccionario, mientras que una lista creada a partir de ella conserva las claves que había en el momento de la conversión. En Python 3.7 y versiones posteriores, la iteración de un diccionario sigue el orden de inserción; las salidas siguientes corresponden a ese comportamiento.

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']

Tanto list(keys_view) como list(state_capitals) crean listas; la segunda expresión funciona porque iterar sobre un diccionario produce sus claves. Intentar acceder a la vista mediante un índice provoca un TypeError. Si el diccionario está vacío, la conversión devuelve [], y acceder por índice a esa lista vacía provoca un IndexError.

Obtener las claves de un diccionario con un bucle

Un bucle explícito resulta útil si necesitas procesar cada clave mientras la añades a la lista. Escribe for key in state_capitals: la palabra clave in es obligatoria y el bucle recibe las claves, no los valores.

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

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

Si el diccionario está vacío, el bucle no se ejecuta y keys queda vacía. Cuando solo necesitas las claves y no vas a realizar ninguna operación adicional dentro del bucle, list(state_capitals) es más breve.

Obtener las claves de un diccionario con una comprensión de listas

Una comprensión de listas permite expresar en una línea el mismo recorrido y la creación de la lista. Es una opción útil si vas a filtrar o transformar cada clave; para copiarlas sin más, el constructor list() es más sencillo.

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

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

Esta comprensión también devuelve [] cuando el diccionario está vacío.

Obtener las claves con el operador de desempaquetado *

La sintaxis de desempaquetado de iterables * permite insertar las claves de un diccionario en una lista: [*state_capitals]. La PEP 448 generalizó el desempaquetado en Python 3.5. Esa compatibilidad histórica se basa en la especificación de la sintaxis; aquí no se ha ejecutado el ejemplo en Python 3.5. También puedes desempaquetar las claves en una tupla o en un conjunto.

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']

El conjunto elimina duplicados y no garantiza un orden de presentación; sorted() hace predecible el orden de las claves mostradas. La tupla y la lista conservan el orden de iteración del diccionario en Python 3.7 y versiones posteriores. Usa la forma con corchetes cuando el resultado deba ser una lista.

Comparar el rendimiento en tiempo de ejecución

Si la velocidad de conversión es relevante para tu programa, mídela con tu intérprete de Python y un diccionario de un tamaño parecido al que utilizas. Este script muestra la versión de Python y el mejor tiempo de cinco ejecuciones, cada una con 10 000 conversiones del mismo diccionario de 100 entradas. Todas las instrucciones medidas crean una lista nueva; el bucle inicia una lista de destino vacía en cada conversión.

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")

Los tiempos obtenidos dependen del intérprete, el equipo y el tamaño del diccionario. Por eso no hay una salida numérica fija ni un método que sea siempre el más rápido. En el código habitual, prefiere list(state_capitals) por su claridad y compara las alternativas solo si la conversión supone un coste significativo en tu programa.