Раньше я делал это примерно так
a = None
for x in list:
if pred(x):
a = x
Очевидно что это не удобно. Как это обойти я подсмотрел здесь (там описано гораздо больше вариантов, но все они плохо работают с случаем когда ничего не найдено)
Итак делаем функцию find (которая должна бы быть в стандартной библиотеке языка)
def find(f, seq):
"""Return first item in sequence where f(item) == True."""
for item in seq:
if f(item):
return item
Дальше поиск прост
a = find(lambda x: x.id == 5, values) #will find value with id == 5 or None if nothing found
Стоит отметить что в 2.6 версии эта проблема решена и все гораздо проще (спасибо @ mishok13 за пример)
next((x for x in seq if pred(x)), None)
или для нашего примера
next((x for x in values if x.id == 5), None)
Какие есть еще более изящные варианты?