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.