Como retornar chaves de dicionário como uma lista em Python?


783

No Python 2.7 , eu poderia obter chaves , valores ou itens do dicionário como uma lista:

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

Agora, em Python> = 3.3 , recebo algo assim:

>>> newdict.keys()
dict_keys([1, 2, 3])

Então, eu tenho que fazer isso para obter uma lista:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

Gostaria de saber, existe uma maneira melhor de retornar uma lista em Python 3 ?


Problema interessante sobre segurança de threads em relação a este tópico está aqui: blog.labix.org/2008/06/27/…
Paul

2
Eu sou novo no Python e, para mim, parece que essa proliferação de novos tipos de dados inúteis é um dos piores aspectos do Python. De que uso esse tipo de dados dict_keys? Por que não uma lista?
Phil Goetz

Respostas:


977

Tente list(newdict.keys()).

Isso converterá o dict_keysobjeto em uma lista.

Por outro lado, você deve se perguntar se isso importa ou não. A maneira Python de codificar é assumir a digitação do pato ( se parecer com um pato e gritar como um pato, é um pato ). O dict_keysobjeto funcionará como uma lista para a maioria dos propósitos. Por exemplo:

for key in newdict.keys():
  print(key)

Obviamente, os operadores de inserção podem não funcionar, mas isso não faz muito sentido para uma lista de chaves de dicionário.


49
não newdict.keys () não suporta a indexação
gypaetus

57
list(newdict)também funciona (pelo menos no python 3.4). Existe algum motivo para usar o .keys()método?
naught101

46
Nota: no depurador pdb> list(newdict.keys()) falha porque entra em conflito com o comando do pdb com o mesmo nome. Use pdb> !list(newdict.keys())para escapar dos comandos pdb.
Riaz Rizvi

24
@ naught101 Sim, .keys()é muito mais claro o que acontece.
Felix D.

2
Observe que, se você usar list (newdict.keys ()), as chaves não estão na ordem em que você as colocou devido à ordem de hash!
Nate M

277

Alternativa Python> = 3.5: descompacte em uma lista literal [*newdict]

Novas generalizações de descompactação (PEP 448) foram introduzidas com o Python 3.5, permitindo agora:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

Descompactar *funciona com qualquer objeto iterável e, como os dicionários retornam suas chaves quando iteradas, é possível criar facilmente uma lista usando-a em um literal de lista.

Adicionar .keys()ie [*newdict.keys()]pode ajudar a tornar sua intenção um pouco mais explícita, apesar de custar uma consulta e chamada de função. (que, com toda a honestidade, não é algo com que você realmente deva se preocupar).

A *iterablesintaxe é semelhante a fazer list(iterable)e seu comportamento foi inicialmente documentado na seção Chamadas do manual de Referência do Python. Com o PEP 448, a restrição sobre onde *iterablepoderia aparecer foi diminuída, permitindo que também fosse colocada em literais de lista, conjunto e tupla, o manual de referência nas listas de Expressão também foi atualizado para declarar isso.


Embora seja equivalente à list(newdict)diferença de que é mais rápido (pelo menos para dicionários pequenos), porque nenhuma chamada de função é realmente executada:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

com dicionários maiores, a velocidade é praticamente a mesma (a sobrecarga de iterar através de uma grande coleção supera o pequeno custo de uma chamada de função).


De maneira semelhante, você pode criar tuplas e conjuntos de chaves de dicionário:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

cuidado com a vírgula à direita no caso da tupla!


grande explicação, mas por favor, você pode consultar qualquer link que descreve este tipo "* newdict" da sintaxe, quero dizer como e por que isso retorna as chaves do dicionário apenas para understanding.Thanx
Muhammad Younus

1
@MYounas Essa sintaxe está disponível há algum tempo, mesmo no Python 2. Nas chamadas de função, você pode fazer def foo(*args): print(args)seguidas de foo(*{1:0, 2:0})resultados (1, 2)impressos. Esse comportamento é especificado na seção Chamadas do manual de referência. O Python 3.5 com PEP 448 apenas afrouxou as restrições sobre onde elas podem aparecer, permitindo [*{1:0, 2:0}]que agora sejam usadas. De qualquer maneira, editarei minha resposta e as incluirei.
Dimitris Fasarakis Hilliard

1
*newdict- esta é definitivamente a resposta para jogadores de código; Além disso: com toda a honestidade, não é algo com que você realmente deva se preocupar - e se estiver, não use python .
Artemis ainda não confia em

46

list(newdict)funciona em Python 2 e Python 3, fornecendo uma lista simples das chaves newdict. keys()não é necessário. (:


26

Um pouco sobre a definição de "digitação de pato" - dict.keys()retorna um objeto iterável, não um objeto de lista. Ele funcionará em qualquer lugar que um iterável funcione - e não em qualquer lugar em que uma lista funcione. uma lista também é iterável, mas iterável NÃO é uma lista (ou sequência ...)

Em casos de uso reais, a coisa mais comum a se fazer com as chaves em um ditado é iterá-las, portanto, isso faz sentido. E se você precisar deles como uma lista, pode ligar list().

De maneira muito semelhante zip()- na grande maioria dos casos, é repetida - por que criar uma nova lista inteira de tuplas apenas para iterá-la e depois jogá-la fora novamente?

Isso faz parte de uma grande tendência no python de usar mais iteradores (e geradores), em vez de cópias de listas em todo o lugar.

dict.keys() deve funcionar com compreensões - verifique cuidadosamente erros de digitação ou algo assim ... funciona bem para mim:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

2
Você nem precisa usar .keys(); o objeto do dicionário é em si iterable ea produz chaves quando iterado: [key.split(", ") for key in d].
Martijn Pieters

25

Você também pode usar uma compreensão de lista :

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

Ou, mais curto,

>>> [k  for  k in  newdict]
[1, 2, 3]

Nota: O pedido não é garantido nas versões sob 3.7 (o pedido ainda é apenas um detalhe de implementação no CPython 3.6).


6
Basta usar list(newdict). Não há necessidade de uma lista de compreensão aqui.
Martijn Pieters

8

A conversão para uma lista sem usar o keysmétodo torna mais legível:

list(newdict)

e, ao percorrer dicionários, não há necessidade de keys():

for key in newdict:
    print key

a menos que você o esteja modificando no loop, o que exigiria uma lista de chaves criadas anteriormente:

for key in list(newdict):
    del newdict[key]

No Python 2, há um ganho marginal de desempenho usandokeys() .


8

Se você precisar armazenar as chaves separadamente, aqui está uma solução que requer menos digitação do que qualquer outra solução apresentada até agora, usando Descompactação Iterável Estendida (python3.x +).

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

            ╒═══════════════╤═════════════════════════════════════════╕
             k = list(d)      9 characters (excluding whitespace)   
            ├───────────────┼─────────────────────────────────────────┤
             k = [*d]         6 characters                          
            ├───────────────┼─────────────────────────────────────────┤
             *k, = d          5 characters                          
            ╘═══════════════╧═════════════════════════════════════════╛

1
A única ressalva menor que eu apontaria é que ksempre há uma lista aqui. Se um usuário quiser uma tupla ou definir as chaves, precisará voltar para as outras opções.
Dimitris Fasarakis Hilliard

1
Uma observação mais digna de nota é o fato de que, como uma declaração, *k, = dtem limitações sobre onde ela pode aparecer (mas veja e talvez atualize esta resposta para PEP 572 - descompactação estendida não é suportada para expressões de atribuição atm, mas pode ser um dia! )
Dimitris Fasarakis Hilliard

e se você quiser as chaves e os valores nas listas?
endolith

1
@ endolith talvez keys, vals = zip(*d.items())(embora isso dê duas tuplas, perto o suficiente). Não conheço uma expressão mais curta que essa.
cs95

1

Eu posso pensar em duas maneiras pelas quais podemos extrair as chaves do dicionário.

Método 1: - Para obter as chaves usando o método .keys () e depois convertê-lo para lista.

some_dict = {1: 'one', 2: 'two', 3: 'three'}
list_of_keys = list(some_dict.keys())
print(list_of_keys)
-->[1,2,3]

Método 2: - Para criar uma lista vazia e depois anexar chaves à lista por meio de um loop. Você também pode obter os valores com esse loop (use .keys () apenas para chaves e .items () para extração de chaves e valores)

list_of_keys = []
list_of_values = []
for key,val in some_dict.items():
    list_of_keys.append(key)
    list_of_values.append(val)

print(list_of_keys)
-->[1,2,3]

print(list_of_values)
-->['one','two','three']
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.