Suponha que eu tenho isso:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
e pesquisando "Pam" como nome, quero recuperar o dicionário relacionado: {name: "Pam", age: 7}
Como conseguir isso?
python
search
dictionary
Hellnar
fonte
fonte
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
a gerar um índice de execução:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.Isso me parece a maneira mais pitônica:
resultado (retornado como uma lista no Python 2):
Nota: No Python 3, um objeto de filtro é retornado. Portanto, a solução python3 seria:
fonte
len()
, é necessário chamarlist()
o resultado primeiro. Ou: stackoverflow.com/questions/19182188/…r
é umalist
next(filter(lambda x: x['name'] == 'Pam', dicts))
A resposta de Frédéric Hamidi é ótima. No Python 3.x, a sintaxe para
.next()
mudou ligeiramente. Assim, uma ligeira modificação:Conforme mencionado nos comentários de @Matt, você pode adicionar um valor padrão como tal:
fonte
Você pode usar uma compreensão de lista :
fonte
fonte
def search(list, key, value): for item in list: if item[key] == value: return item
Testei vários métodos para percorrer uma lista de dicionários e retornar os dicionários em que a chave x tem um determinado valor.
Resultados:
Todos os testes feitos com Python 3.6 .4, W7x64.
Resultados:
fonte
Para adicionar um pouquinho ao @ FrédéricHamidi.
Caso você não tenha certeza de que existe uma chave na lista de ditados, algo como isso ajudaria:
fonte
item.get("name") == "Pam"
Você já experimentou o pacote pandas? É perfeito para esse tipo de tarefa de pesquisa e otimizado também.
Adicionei um pouco de benchmarking abaixo para ilustrar os tempos de execução mais rápidos dos pandas em uma escala maior, ou seja, 100k + entradas:
fonte
Esta é uma maneira geral de pesquisar um valor em uma lista de dicionários:
fonte
Esta é uma maneira ...
fonte
Simplesmente usando a compreensão da lista:
Código de amostra:
fonte
Você pode conseguir isso usando o filtro e os próximos métodos no Python.
filter
O método filtra a sequência especificada e retorna um iterador.next
O método aceita um iterador e retorna o próximo elemento na lista.Para encontrar o elemento,
e a saída é,
Nota: O código acima retornará
None
caso que o nome que estamos procurando não seja encontrado.fonte
Meu primeiro pensamento seria que você poderia querer criar um dicionário desses dicionários ... se, por exemplo, você o procuraria mais do que um pequeno número de vezes.
No entanto, isso pode ser uma otimização prematura. O que haveria de errado com:
fonte
fonte
Uma maneira simples de usar a compreensão da lista é, se
l
for a listaentão
fonte
Você pode tentar isso:
fonte
Aqui está uma comparação usando iterating throuhg list, usando filter + lambda ou refatorando (se necessário ou válido para o seu caso) seu código para ditar ditados em vez de lista de dict
E a saída é esta:
Conclusão: ter claramente um dicionário de dict é a maneira mais eficiente de poder pesquisar nesses casos, em que você sabe que estará pesquisando apenas por IDs. Curiosamente, usar o filtro é a solução mais lenta.
fonte
Você precisa passar por todos os elementos da lista. Não há um atalho!
A menos que em outro lugar você mantenha um dicionário de nomes apontando para os itens da lista, mas precisará cuidar das conseqüências de exibir um elemento da lista.
fonte
Encontrei este tópico quando estava procurando uma resposta para a mesma pergunta. Embora perceba que é uma resposta tardia, pensei em contribuir com isso, caso seja útil para outras pessoas:
fonte
A maioria (se não todas) das implementações propostas aqui tem duas falhas:
Uma proposta atualizada:
Talvez não seja o mais pitônico, mas pelo menos um pouco mais à prova de falhas.
Uso:
A essência .
fonte