Controlla se l'elenco di oggetti contiene un oggetto con un determinato valore di attributo


104

Voglio controllare se il mio elenco di oggetti contiene un oggetto con un determinato valore di attributo.

class Test:
    def __init__(self, name):
        self.name = name

# in main()
l = []
l.append(Test("t1"))
l.append(Test("t2"))
l.append(Test("t2"))

Voglio un modo per verificare se l'elenco contiene un oggetto con nome, "t1"ad esempio. Come si può fare? Ho trovato https://stackoverflow.com/a/598415/292291 ,

[x for x in myList if x.n == 30]               # list of all matches
any(x.n == 30 for x in myList)                 # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30]  # indices of all matches

def first(iterable, default=None):
    for item in iterable:
        return item
    return default

first(x for x in myList if x.n == 30)          # the first match, if any

Non voglio scorrere l'intero elenco ogni volta, ho solo bisogno di sapere se c'è 1 istanza che corrisponde. Lo farà first(...)o any(...)qualcos'altro lo farà?


La first()funzione è disponibile come built-in chiamato next().
Sven Marnach

Risposte:


169

Come puoi facilmente vedere dalla documentazione , la any()funzione cortocircuita e ritorna Truenon appena viene trovata una corrispondenza.

any(x.name == "t2" for x in l)
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.