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 ?
python
python-3.x
list
dictionary
python-2.x
Dimitris Fasarakis Hilliard
fonte
fonte
Respostas:
Tente
list(newdict.keys())
.Isso converterá o
dict_keys
objeto 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_keys
objeto funcionará como uma lista para a maioria dos propósitos. Por exemplo: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.
fonte
list(newdict)
também funciona (pelo menos no python 3.4). Existe algum motivo para usar o.keys()
método?pdb> list(newdict.keys())
falha porque entra em conflito com o comando do pdb com o mesmo nome. Usepdb> !list(newdict.keys())
para escapar dos comandos pdb..keys()
é muito mais claro o que acontece.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:
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
*iterable
sintaxe é semelhante a fazerlist(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*iterable
poderia 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: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:
cuidado com a vírgula à direita no caso da tupla!
fonte
def foo(*args): print(args)
seguidas defoo(*{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.*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 .list(newdict)
funciona em Python 2 e Python 3, fornecendo uma lista simples das chavesnewdict
.keys()
não é necessário. (:fonte
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:fonte
.keys()
; o objeto do dicionário é em si iterable ea produz chaves quando iterado:[key.split(", ") for key in d]
.Você também pode usar uma compreensão de lista :
Ou, mais curto,
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).
fonte
list(newdict)
. Não há necessidade de uma lista de compreensão aqui.A conversão para uma lista sem usar o
keys
método torna mais legível:e, ao percorrer dicionários, não há necessidade de
keys()
:a menos que você o esteja modificando no loop, o que exigiria uma lista de chaves criadas anteriormente:
No Python 2, há um ganho marginal de desempenho usando
keys()
.fonte
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 +).
fonte
k
sempre há uma lista aqui. Se um usuário quiser uma tupla ou definir as chaves, precisará voltar para as outras opções.*k, = d
tem 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! )keys, vals = zip(*d.items())
(embora isso dê duas tuplas, perto o suficiente). Não conheço uma expressão mais curta que essa.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.
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)
fonte