Eu me deparei com isso:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
mas às vezes não funciona com todos os meus itens, como se não fossem reconhecidos na lista (quando é uma lista de cadeias).
Essa é a maneira mais 'pitônica' de encontrar um item em uma lista if x in l:
:?
myList
.Respostas:
Quanto à sua primeira pergunta: esse código é perfeitamente adequado e deve funcionar se for
item
igual a um dos elementos internosmyList
. Talvez você tente encontrar uma string que não corresponda exatamente a um dos itens ou talvez esteja usando um valor flutuante que sofra imprecisão.Quanto à sua segunda pergunta: Na verdade, existem várias maneiras possíveis de "encontrar" coisas nas listas.
Verificando se algo está dentro
Este é o caso de uso que você descreve: Verificando se algo está dentro de uma lista ou não. Como você sabe, você pode usar o
in
operador para isso:Filtrando uma coleção
Ou seja, localizando todos os elementos em uma sequência que atendem a uma determinada condição. Você pode usar compreensão de lista ou expressões geradoras para isso:
O último retornará um gerador que você pode imaginar como uma espécie de lista lenta que só será criada assim que você iterar. A propósito, o primeiro é exatamente equivalente a
no Python 2. Aqui você pode ver funções de ordem superior em funcionamento. No Python 3,
filter
não retorna uma lista, mas um objeto semelhante ao gerador.Localizando a primeira ocorrência
Se você deseja apenas a primeira coisa que corresponda a uma condição (mas ainda não sabe o que é), é bom usar um loop for (possivelmente usando a
else
cláusula também, o que não é muito conhecido). Você também pode usarque retornará a primeira partida ou aumentará a
StopIteration
se nenhuma for encontrada. Como alternativa, você pode usarLocalizando a localização de um item
Para listas, também há o
index
método que às vezes pode ser útil se você quiser saber onde um determinado elemento está na lista:No entanto, observe que, se você tiver duplicatas,
.index
sempre retornará o índice mais baixo: ......Se houver duplicatas e você desejar todos os índices, poderá usar
enumerate()
:fonte
if x in list
é o que as pessoas reclamam por não serem uma função embutida. Eles reclamam do fato de não haver uma maneira explícita de encontrar a primeira ocorrência de algo em uma lista que corresponde a uma determinada condição. Mas, como indicado na minha resposta, pode ser (ab) usado para isso.next()
[list comprehension...][0]
abordagemindex()
chamadokey
que funcionasse como okey
aceito pormax()
; por exemplo:index(list, key=is_prime)
.Se você deseja encontrar um elemento ou
None
usar o padrãonext
, ele não aumentaráStopIteration
se o item não for encontrado na lista:fonte
next
usa um iterador como o primeiro parâmetro e uma lista / tupla NÃO é um iterador. Por isso, deve serfirst_or_default = next(iter([x for x in lst if ...]), None)
ver docs.python.org/3/library/functions.html#next(x for x in lst if ...)
é um gerador sobre a listalst
(que é um iterador). Se você fizer issonext(iter([x for x in lst if ...]), None)
, precisará construir a lista[x for x in lst if ...]
, que será uma operação muito mais cara.if
em um lambda e você pode escreverfind(fn,list)
normalmente em vez de ofuscar o código do gerador.Embora a resposta de Niklas B. seja bastante abrangente, quando queremos encontrar um item em uma lista, às vezes é útil obter seu índice:
fonte
Localizando a primeira ocorrência
Há uma receita para isso em
itertools
:Por exemplo, o código a seguir localiza o primeiro número ímpar em uma lista:
fonte
Outra alternativa: você pode verificar se um item está em uma lista com
if item in list:
, mas esta é a ordem O (n). Se você está lidando com grandes listas de itens e tudo o que precisa saber é se algo é membro da sua lista, você pode converter a lista em um conjunto primeiro e tirar proveito da pesquisa constante do conjunto de tempo :Não será a solução correta em todos os casos, mas, em alguns casos, isso pode oferecer um melhor desempenho.
Observe que criar o conjunto com
set(my_list)
também é O (n); portanto, se você precisar fazer isso apenas uma vez, não será mais rápido fazê-lo dessa maneira. Se você precisar verificar repetidamente a associação, será O (1) para todas as pesquisas após a criação inicial do conjunto.fonte
Você pode usar uma das duas pesquisas possíveis enquanto trabalha com a lista de cadeias de caracteres:
se o elemento da lista for igual a um item ('exemplo' está em ['um', 'exemplo', 'dois']):
if item in your_list: some_function_on_true()
'ex' em ['um', 'ex', 'dois'] => Verdadeiro
'ex_1' em ['um', 'ex', 'dois'] => Falso
se o elemento da lista for como um item ('ex' está em ['um,' exemplo ',' dois '] ou' exemplo_1 'está em [' um ',' exemplo ',' dois ']):
matches = [el for el in your_list if item in el]
ou
matches = [el for el in your_list if el in item]
basta verificar
len(matches)
ou ler se necessário.fonte
Definição e Uso
o
count()
método retorna o número de elementos com o valor especificado.Sintaxe
exemplo:
Exemplo da pergunta:
fonte
Em vez de usar o
list.index(x)
que retorna o índice de x se ele for encontrado na lista ou retorna uma#ValueError
mensagem se x não for encontrado, você pode usar olist.count(x)
que retorna o número de ocorrências de x na lista (validação de que x está realmente na lista) ou retorna 0 caso contrário (na ausência de x). O legalcount()
é que ele não quebra seu código ou exige que você lance uma exceção para quando x não for encontradofonte
Se você vai verificar se o valor existe no colecionável uma vez, usar o operador 'in' é bom. No entanto, se você for verificar mais de uma vez, recomendo o uso do módulo bisect. Lembre-se de que os dados do módulo bisect devem ser classificados. Assim, você classifica os dados uma vez e depois pode usar a divisão. O uso do módulo bisect na minha máquina é cerca de 12 vezes mais rápido que o uso do operador 'in'.
Aqui está um exemplo de código usando a sintaxe Python 3.8 e acima:
Resultado:
fonte
Verifique se não há espaço em branco adicional / indesejado nos itens da lista de cadeias. Esse é um motivo que pode estar interferindo na explicação dos itens não encontrados.
fonte