Eu tenho uma lista de ditados como este:
[{'value': 'apple', 'blah': 2},
{'value': 'banana', 'blah': 3} ,
{'value': 'cars', 'blah': 4}]
eu quero ['apple', 'banana', 'cars']
Qual é a melhor forma de fazer isso?
python
list
dictionary
SuperString
fonte
fonte
Aqui está outra maneira de fazer isso usando as funções map () e lambda:
onde eu sou a lista. Eu vejo esse caminho "mais sexy", mas faria isso usando a compreensão da lista.
Atualização: Caso esse 'valor' possa estar faltando como uso principal:
Atualização: Eu também não sou muito fã de lambdas, prefiro citar coisas ... é assim que eu faria com isso em mente:
Eu iria ainda mais longe e criaria uma única função que explicitamente diz o que quero alcançar:
Com o Python 3, como
map
retorna um iterador, uselist
para retornar uma lista, por exemplolist(map(operator.itemgetter('value'), l))
.fonte
map
, useoperator.itemgetter('value')
, não alambda
.fonte
getkey
.. você quer dizerd.get('value')
? Seria o mesmo que a segunda lista de @ isbadawi, não a de Michal.Para um caso muito simples como esse, uma compreensão, como na resposta de Ismail Badawi é definitivamente o caminho a percorrer.
Mas quando as coisas ficam mais complicadas e você precisa começar a escrever compreensões com várias cláusulas ou aninhadas com expressões complexas, vale a pena procurar outras alternativas. Existem algumas maneiras diferentes (quase) padrão de especificar pesquisas no estilo XPath em estruturas de dict-and-list aninhadas, como JSONPath, DPath e KVC. E existem boas bibliotecas no PyPI para eles.
Aqui está um exemplo com a biblioteca nomeada
dpath
, mostrando como ela pode simplificar algo um pouco mais complicado:Ou, usando
jsonpath-ng
:Este pode não parecer tão simples à primeira vista, porque
find
retorna objetos correspondentes, que incluem todos os tipos de coisas além do valor correspondente, como um caminho diretamente para cada item. Porém, para expressões mais complexas, a possibilidade de especificar um caminho como, em'*.[*].value'
vez de uma cláusula de compreensão, para cada um*
pode fazer uma grande diferença. Além disso, o JSONPath é uma especificação independente de idioma e existem até testadores on-line que podem ser muito úteis para depuração.fonte
Eu acho que tão simples como abaixo daria o que você está procurando.
Você pode fazer isso com uma combinação de
map
elambda
também, mas a compreensão da lista parece mais elegante e pitônica.Para uma compreensão menor da lista de entradas, é o caminho a percorrer, mas se a entrada for realmente grande, acho que os geradores são a maneira ideal.
Aqui está uma comparação de todas as soluções possíveis para maior entrada
Como você pode ver, os geradores são uma solução melhor em comparação com os outros, o mapa também é mais lento em comparação com o gerador, pelo que deixarei a OP descobrir.
fonte
Siga o exemplo --
fonte
Obter valores-chave da lista de dicionários em python?
Ex:
para d em dados:
Resultado:
fonte
Uma maneira muito simples de fazer isso é:
Resultado:
fonte