You can first make a list of names and then use the count method:
list(map(lambda x: x.name, person_list)).count('Alan') > 0
It will return False if the person doesn't exist in the list.
I performed a speed test comparing map and any approach:
names = list(map(str, np.random.randint(0, 10, 1000)))
person_list = [Person(name) for name in names]
%timeit list(map(lambda x: x.name, person_list)).count('Alan') > 0
%timeit any(p.name == 'Alan' for p in person_list)
and the results:
207 µs ± 34.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
122 µs ± 17.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
So any approach is faster.
UPDATE
Using attrgetter with map reaches the best performance:
from operator import attrgetter
f = attrgetter('name')
names = list(map(str, np.random.randint(0, 10, 1000)))
person_list = [Person(name) for name in names]
%timeit list(map(f, person_list)).count('Alan') > 0
%timeit any(f(p) == 'Alan' for p in person_list)
And the result:
110 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
172 µs ± 6.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)