Como obter chaves de dicionário como uma lista em Python
-
dict.keys()
para obter chaves de dicionário Python - Loops para obter as chaves do dicionário Python
- Lista compreensões para obter as chaves do Python Dictionary
-
O dicionário Python desempacota o operador
*
para obter as chaves - Comparando o desempenho em tempo de execução
Obter uma visão das teclas do dicionário como sequência é um caso de uso diário na programação Python.
Existem várias abordagens para o conseguir, cada uma com características de desempenho diferentes.
dict.keys()
para obter chaves de dicionário Python
A função dict.keys()
retorna dict_keys
- uma visão iterável das chaves do dicionário.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> state_capitals.keys()
dict_keys(['California', 'Pennsylvania', 'Texas'])
Você pode iterar sobre dict_keys
diretamente sem convertê-lo em uma lista.
Para muitos casos de uso, dict_keys
pode ser descartado ao invés de uma lista nas APIs, e irá funcionar.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> for state in state_capitals.keys():
... print(state)
...
California
Pennsylvania
Texas
Se você precisa trabalhar em chaves de dicionário estritamente como em listas, por exemplo, se você quiser
para poder usar um índice para ler uma determinada chave da seqüência, você deve converter
dict_keys
em uma lista primeiro.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> list(state_capitals.keys())
['California', 'Pennsylvania', 'Texas']
Note que chamar dict.keys()
é opcional se você quiser obter chaves como uma lista.
Como os dicionários Python são iteráveis sobre suas chaves, você pode passar um
dicionário em si em um construtor de listas.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> list(state_capitals)
['California', 'Pennsylvania', 'Texas']
Loops para obter as chaves do dicionário Python
Uma propriedade peculiar dos dicionários em Python é que quando você itera sobre eles,
você itera as chaves deles.
Assim, você pode coletar todas as chaves do dicionário de forma simples, iterando sobre ele.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> keys = []
>>> for key im state_capitals:
... keys.append(key)
...
>>> keys
['California', 'Pennsylvania', 'Texas']
Lista compreensões para obter as chaves do Python Dictionary
Uma melhoria sintáctica em relação ao uso de loops pode ser usando o Python list comprehensions.
Com as compreensões de lista, você pode condensar o laço acima em uma única linha.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> keys = [key for key in state_capitals]
>>> keys
['California', 'Pennsylvania', 'Texas']
O dicionário Python desempacota o operador *
para obter as chaves
A partir do Python 3.5, podemos utilizar o operador unpacking *
para obter uma retenção sobre as teclas do dicionário.
Esta funcionalidade foi introduzida com PEP 448 - Generalizações Adicionais de Desempacotamento.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> keys = [*state_capitals]
>>> keys
['California', 'Pennsylvania', 'Texas']
A vantagem desta abordagem é que você pode desempacotar suas chaves de dicionário em outras coleções além das listas, tais como tuples ou conjuntos.
>>> state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}
>>> keys_tuple = *state_capitals,
>>> keys_tuple
('California', 'Pennsylvania', 'Texas')
>>> keys_set = {*state_capitals}
>>> keys_set
{'California', 'Pennsylvania', 'Texas'}
Comparando o desempenho em tempo de execução
Os desempenhos em tempo de execução de cada uma das abordagens acima variam.
>>> from timeit import timeit
>>> timeit("list(state_capitals.keys())", setup="state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}")
0.25394885599962436
>>> timeit("list(state_capitals)", setup="state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}")
0.17995373999929143
>>> timeit("for key in state_capitals: keys.append(key)", setup="keys = []; state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}")
0.25294865500018204
>>> timeit("[key for key in state_capitals]", setup="state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}")
0.2447525150000729
>>> timeit("[*state_capitals]", setup="state_capitals = {'California': 'Sacramento', 'Pennsylvania': 'Harrisburg', 'Texas': 'Austin'}")
0.0962776809992647
Como se segue dos timings acima, o operador que desempacota *
é o mais rápido.
Prefira-o, a menos que tenha uma boa razão para voltar a qualquer uma das outras aproximações.