Esiste una funzione breve per gli elenchi?


515

Vedo che le persone usano anyper raccogliere un altro elenco per vedere se esiste un elemento in un elenco, ma esiste un modo rapido per farlo ?:

if list.contains(myItem):
    # do something

La tua domanda implica che sei interessato solo all'elenco contiene elementi , non l' elenco contiene un elenco secondario? / tuple / set / frozenset / ...?
smci,

Risposte:


875

È possibile utilizzare questa sintassi:

if myItem in list:
    # do something

Inoltre, operatore inverso:

if myItem not in list:
    # do something

Funziona benissimo per liste, tuple, set e dadi (controlla i tasti).

Si noti che questa è un'operazione O (n) in elenchi e tuple, ma un'operazione O (1) in set e dicts.


1
Con un elenco contenente array numpy, questo verificherà le istanze o i valori numpy all'interno delle istanze numpy?
Daniel Möller,

Attenzione! Ciò corrisponde mentre questo è molto probabilmente quello che non ti aspettavi:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: corrisponde perché ("--skip-ias")non è una tupla, ma una stringa (le parentesi non fanno nulla, proprio come (1)è solo un numero intero). Se vuoi una tupla, devi aggiungere una virgola dopo il singolo elemento: ("--skip-ias",)(o (1,)).
Blckknght,

Nota che se stai confrontando i caratteri, questo non fa distinzione tra maiuscole e minuscole.
Tillson,

65

Oltre a ciò che altri hanno detto, potresti anche essere interessato a sapere che ciò che infa è chiamare il list.__contains__metodo, che puoi definire su qualsiasi classe che scrivi e che può essere estremamente utile per usare Python al massimo.  

Un uso stupido può essere:

>>> 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

Di recente mi è venuta in mente questa fodera per sapere Truese un elenco contiene un numero qualsiasi di occorrenze di un elemento o Falsese non contiene occorrenze o nulla. L'uso di next(...)questo fornisce un valore di ritorno predefinito ( False) e significa che dovrebbe essere eseguito molto più velocemente rispetto all'esecuzione dell'intera comprensione dell'elenco.

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


Nel mio caso ho un elenco di oggetti chiamato Categoria e ne ho bisogno per testare solo la proprietà Link, quindi questa soluzione si adatta meglio al mio caso. Grazie
rodrigorf il

3
any(item == test_item for item in list_to_test)funzionerebbe anche io, penso?
Qualcuno il

3

Il metodo elenco indexrestituirà -1se l'elemento non è presente e restituirà l'indice dell'elemento nell'elenco se è presente. In alternativa, in una ifdichiarazione è possibile effettuare le seguenti operazioni:

if myItem in list:
    #do things

Puoi anche verificare se un elemento non è in un elenco con la seguente istruzione if:

if myItem not in list:
    #do things

15
Il indexmetodo non restituisce -1 se l'elemento non è presente, genera ValueErrorun'eccezione.
MondKin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.