Portanto, tenho uma lista de tuplas como esta:
[(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
Eu quero essa lista para uma tupla cujo valor numérico é igual a alguma coisa.
Portanto, se eu fizer search(53)
isso, o valor do índice de2
Existe uma maneira fácil de fazer isso?
Você pode usar uma compreensão de lista :
fonte
tl; dr
Uma expressão geradora é provavelmente a solução mais simples e eficiente para o seu problema:
Explicação
Existem várias respostas que fornecem uma solução simples para essa questão com compreensões de lista. Embora essas respostas sejam perfeitamente corretas, elas não são as ideais. Dependendo do seu caso de uso, pode haver benefícios significativos em fazer algumas modificações simples.
O principal problema que vejo ao usar uma compreensão de lista para este caso de uso é que a lista inteira será processada, embora você queira encontrar apenas 1 elemento .
Python fornece uma construção simples que é ideal aqui. É chamada de expressão geradora . Aqui está um exemplo:
Podemos esperar que esse método execute basicamente o mesmo que as compreensões de lista em nosso exemplo trivial, mas e se estivermos trabalhando com um conjunto de dados maior? É aí que entra a vantagem de usar o método gerador. Em vez de construir uma nova lista, usaremos sua lista existente como nosso iterável e usaremos
next()
para obter o primeiro item de nosso gerador.Vamos ver como esses métodos funcionam de maneira diferente em alguns conjuntos de dados maiores. Essas são listas grandes, feitas de 10000000 + 1 elementos, com nosso alvo no início (melhor) ou no final (pior). Podemos verificar que ambas as listas terão um desempenho igual usando a seguinte compreensão de lista:
Compreensões de lista
"Pior caso"
"Melhor caso"
Expressões geradoras
Aqui está minha hipótese para geradores: veremos que os geradores terão um desempenho significativamente melhor no melhor caso, mas da mesma forma no pior caso. Esse ganho de desempenho se deve principalmente ao fato de que o gerador é avaliado vagarosamente, o que significa que ele computará apenas o que é necessário para gerar um valor.
Pior caso
Melhor caso
O QUE?! O melhor caso destrói as compreensões de lista, mas eu não esperava que nosso pior caso superasse as compreensões de lista a tal ponto. Como é isso? Francamente, eu só poderia especular sem mais pesquisas.
Considere tudo isso com cautela, não executei nenhum perfil robusto aqui, apenas alguns testes básicos. Isso deve ser suficiente para avaliar que uma expressão geradora tem melhor desempenho para esse tipo de pesquisa de lista.
Observe que tudo isso é python básico e integrado. Não precisamos importar nada ou usar qualquer biblioteca.
Eu vi essa técnica pela primeira vez para pesquisa no curso Udacity cs212 com Peter Norvig.
fonte
Suas tuplas são basicamente pares de valores-chave - um python -
dict
então:Editar - aha, você diz que deseja o valor do índice de (53, "xuxa"). Se isso é realmente o que você deseja, você terá que iterar pela lista original ou talvez fazer um dicionário mais complicado:
fonte
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")] val = dict(l).get(53)
Hmm ... bem, a maneira simples que vem à mente é convertê-lo em um dicionário
e acesso
d[53]
.EDIT : Oops, interpretou mal sua pergunta na primeira vez. Parece que você realmente deseja obter o índice onde um determinado número está armazenado. Nesse caso, tente
em vez de uma simples
dict
conversão antiga . Entãod[53]
seriam 2.fonte
Supondo que a lista possa ser longa e os números possam se repetir, considere usar o tipo SortedList do módulo Python SortedContainers . O tipo SortedList manterá automaticamente as tuplas em ordem por número e permitirá uma pesquisa rápida.
Por exemplo:
Isso funcionará muito mais rápido do que a sugestão de compreensão da lista fazendo uma pesquisa binária. A sugestão de dicionário será mais rápida ainda, mas não funcionará se houver números duplicados com strings diferentes.
Se houver números duplicados com strings diferentes, você precisará realizar mais uma etapa:
Ao dividir ao meio para 54, encontraremos o índice final para nossa fatia. Isso será significativamente mais rápido em listas longas em comparação com a resposta aceita.
fonte
Apenas outra maneira.
fonte
[k para k, v em l if v == ' delicia ']
aqui l é a lista de tuplas - [(1, "juca"), (22, "james"), (53, "xuxa"), (44, "delicia")]
E em vez de convertê-lo em um dicionário, estamos usando a compreensão de lista.
*Key* in Key,Value in list, where value = **delicia**
fonte