Como obter chaves de dicionário como uma lista em Python

  1. dict.keys() para obter chaves de dicionário Python
  2. Loops para obter as chaves do dicionário Python
  3. Lista compreensões para obter as chaves do Python Dictionary
  4. O dicionário Python desempacota o operador * para obter as chaves
  5. 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.

Artigo relacionado - Python Dictionary

  • Como fundir dois dicionários em Python 2 e 3
  • Adicionar chave a um dicionário em Python