Existe uma função curta para listas?


515

Vejo que as pessoas estão usando anypara reunir outra lista para ver se existe um item em uma lista, mas existe uma maneira rápida de fazer isso:

if list.contains(myItem):
    # do something

Sua pergunta indica que você está interessado apenas na lista contém itens , e não na lista contém sublist? / tupla / conjunto / frozenset / ...?
smci 31/12/19

Respostas:


875

Você pode usar esta sintaxe:

if myItem in list:
    # do something

Além disso, operador inverso:

if myItem not in list:
    # do something

É um bom trabalho para listas, tuplas, conjuntos e dictos (teclas de verificação).

Observe que esta é uma operação O (n) em listas e tuplas, mas uma operação O (1) em conjuntos e dictos.


1
Com uma lista contendo matrizes numpy, isso verificará instâncias ou valores numpy dentro das instâncias numpy?
Daniel Möller

Cuidado! Isso corresponde, embora seja provavelmente o que você não esperava:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Isso corresponde porque ("--skip-ias")não é uma tupla, mas uma string (os parênteses não fazem nada, assim como (1)é apenas um número inteiro). Se você deseja uma tupla de 1, você precisa adicionar uma vírgula após o item único: ("--skip-ias",)(ou (1,)).
Blckknght

Observe que, se você estiver comparando caracteres, isso não diferencia maiúsculas de minúsculas.
Tillson

65

Além do que outros disseram, você também pode estar interessado em saber que o que infaz é chamar o list.__contains__método, que você pode definir em qualquer classe que escrever e pode ser extremamente útil para usar python em toda sua extensão.  

Um uso tolo pode ser:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

Eu vim com esse liner recentemente para saber Truese uma lista contém qualquer número de ocorrências de um item ou Falsese não contém ocorrências ou nada. O uso next(...)fornece um valor de retorno padrão ( False) e significa que ele deve executar significativamente mais rápido do que executar toda a compreensão da lista.

list_does_contain = next((True for item in list_to_test if item == test_item), False)


No meu caso, tenho uma lista de objetos chamada Category e preciso testá-lo apenas para a propriedade Link, para que essas soluções se encaixem melhor no meu caso. Graças
rodrigorf

3
any(item == test_item for item in list_to_test)funcionaria também, eu acho?
alguém

3

O método list indexretornará -1se o item não estiver presente e retornará o índice do item na lista, se estiver presente. Como alternativa, em uma ifdeclaração, você pode fazer o seguinte:

if myItem in list:
    #do things

Você também pode verificar se um elemento não está em uma lista com a seguinte instrução if:

if myItem not in list:
    #do things

15
O indexmétodo não retorna -1 se o elemento não estiver presente, lança uma ValueErrorexceção.
MondKin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.