Verifique se a lista de objetos contém um objeto com um determinado valor de atributo

103

Quero verificar se minha lista de objetos contém um objeto com um determinado valor de atributo.

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

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

Eu quero uma maneira de verificar se a lista contém um objeto com nome, "t1"por exemplo. Como pode ser feito? Encontrei 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

Não quero passar por toda a lista todas as vezes, só preciso saber se há 1 instância correspondente. Será que first(...)ou any(...)algo mais fará isso?

Jiew Meng
fonte
A first()função está disponível como uma chamada embutida next().
Sven Marnach

Respostas:

168

Como você pode ver facilmente na documentação , a any()função entra em curto-circuito e retorna Trueassim que uma correspondência for encontrada.

any(x.name == "t2" for x in l)
Sven Marnach
fonte