HOWTO · Python

Como obter as chaves de um dicionário como lista em Python

Aprenda a obter as chaves de um dicionário Python como lista com list(), laços, compreensões de lista ou desempacotamento e entenda a diferença entre dict_keys e uma lista.

Nesta página

Para obter as chaves de um dicionário Python como lista, use list(my_dict). A expressão list(my_dict.keys()) produz a mesma lista. Em ambos os casos, o construtor list() reúne as chaves em uma nova lista. Já o método my_dict.keys() sozinho retorna uma visão dict_keys: você pode percorrê-la, mas não acessá-la por índice como faria com uma lista. Converta as chaves quando precisar de uma lista; caso contrário, geralmente basta percorrer o dicionário diretamente.

Use dict.keys() para obter as chaves de um dicionário Python

O método dict.keys() retorna uma visão das chaves atuais. Essa visão reflete alterações posteriores no dicionário, enquanto uma lista criada a partir dela é uma cópia independente naquele momento. No Python 3.7 e em versões posteriores, a iteração de um dicionário segue a ordem de inserção; a ordem mostrada abaixo pressupõe esse comportamento.

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) quanto list(state_capitals) criam listas. A segunda forma funciona porque percorrer um dicionário produz suas chaves. Tentar acessar a própria visão por índice gera TypeError. Se o dicionário estiver vazio, a conversão produz []; acessar um índice dessa lista vazia gera IndexError.

Use laços para obter as chaves de um dicionário Python

Um laço explícito é útil quando você precisa processar cada chave enquanto a adiciona à lista. Use for key in state_capitals: a palavra-chave in é obrigatória, e o laço recebe as chaves, não os valores.

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

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

Se o dicionário estiver vazio, o laço não executa nenhuma iteração e keys permanece vazia. Se você só precisa reunir as chaves, sem fazer outro processamento no laço, list(state_capitals) é mais conciso.

Use compreensões de lista para obter as chaves de um dicionário Python

Uma compreensão de lista expressa a mesma coleta em uma linha. Essa forma é útil quando você pretende acrescentar um filtro ou transformar cada chave; para apenas copiá-las, o construtor list() é mais simples.

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

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

Essa compreensão também produz [] quando o dicionário está vazio.

Use o operador de desempacotamento * para obter as chaves do dicionário

A sintaxe de desempacotamento de iteráveis com * permite inserir as chaves de um dicionário em uma lista: [*state_capitals]. A PEP 448 generalizou o desempacotamento no Python 3.5. Essa informação de compatibilidade vem da especificação da sintaxe; o exemplo não foi executado aqui no Python 3.5. O desempacotamento também funciona na criação de tuplas e conjuntos.

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

O conjunto elimina duplicatas e não garante uma ordem de exibição; sorted() torna previsível a ordem apresentada no exemplo. A tupla e a lista preservam a ordem de iteração do dicionário no Python 3.7 e em versões posteriores. Use a forma com colchetes quando o resultado precisar ser uma lista.

Compare o desempenho de execução

Se a velocidade da conversão for relevante, faça medições com o interpretador Python que você usa e com um dicionário de tamanho semelhante ao dos seus dados. O script abaixo mostra a versão do Python e o menor tempo de cinco execuções, cada uma com 10.000 conversões do mesmo dicionário de 100 entradas. Cada instrução cronometrada cria uma nova lista; no caso do laço, a lista de destino também é recriada a cada conversão.

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

Os tempos exibidos dependem do interpretador, da máquina e do tamanho do dicionário. Por isso, não há uma saída numérica fixa nem um método universalmente mais rápido. No código cotidiano, prefira list(state_capitals) pela clareza; compare as alternativas quando a conversão tiver um custo relevante no seu programa.