Eu tenho uma lista de ditados:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
Como posso encontrar com eficiência a posição do índice [0], [1] ou [2] combinando com name = 'Tom'?
Se essa fosse uma lista unidimensional, eu poderia fazer list.index (), mas não tenho certeza de como proceder pesquisando os valores dos dicts na lista.
{ 'Jason': {'id': '1234'}, 'Tom': {'id': '1245'}, ...}
?) #{'1234': {'name': 'Jason'}, ...}
. Não que isso ajude esse caso de uso.Respostas:
Se você precisar buscar repetidamente o nome, indexe-os por nome (usando um dicionário), dessa maneira as operações get serão O (1) time. Uma ideia:
fonte
next()
isso me parece estranho), o objetivo é apenas obter o índice. Além disso, isso gera StopIteration, enquanto olst.index()
método Python gera ValueError.first()
soa melhor. Você sempre pode tentar / exceto o StopIteration e aumentar ValueError para que o chamador tenha consistência. Como alternativa, definanext()
o padrão como -1.SyntaxError: Generator expression must be parenthesized if not sole argument
ao fazer isso.next((index for (index, d) in enumerate(lst) if d["name"] == "Tom"), None)
Uma versão simples e legível é
fonte
str.find()
bem. Você também pode chamá-loindex()
e aumentar um emValueError
vez de retornar -1, se preferível.Não será eficiente, pois você precisa percorrer a lista verificando todos os itens (O (n)). Se você quer eficiência, pode usar o dict of dicts . Sobre a questão, aqui está uma maneira possível de encontrá-lo (porém, se você deseja manter essa estrutura de dados, é realmente mais eficiente usar um gerador, como Brent Newey escreveu nos comentários; veja também a resposta do tokland):
fonte
Aqui está uma função que localiza a posição de índice do dicionário, se existir.
fonte
Parece mais lógico usar uma combinação de filtro / índice:
E se você acha que pode haver várias correspondências:
fonte
A resposta oferecida por @faham é uma ótima linha, mas não retorna o índice para o dicionário que contém o valor. Em vez disso, ele retorna o próprio dicionário. Aqui está uma maneira simples de obter: Uma lista de índices, um ou mais, se houver mais de um, ou uma lista vazia, se não houver:
Resultado:
O que eu gosto nessa abordagem é que, com uma edição simples, você pode obter uma lista dos índices e dos dicionários como tuplas. Este é o problema que eu precisava resolver e encontrei essas respostas. A seguir, adicionei um valor duplicado em um dicionário diferente para mostrar como ele funciona:
Resultado:
Esta solução localiza todos os dicionários que contêm 'Tom' em qualquer um de seus valores.
fonte
Um forro !?
fonte
Para um dado iterável,
more_itertools.locate
gera posições de itens que satisfazem um predicado.more_itertools
é uma biblioteca de terceiros que implementa receitas de ferramentas entre outras ferramentas úteis.fonte
fonte