Получить индекс в списке объектов по атрибуту в Python

У меня есть список объектов с идентификатором атрибута, и я хочу найти индекс объекта с определенным идентификатором. Я написал что-то вроде этого:

index = -1 for i in range(len(my_list)): if my_list[i].id == 'specific_id' index = i break 

но это выглядит не очень хорошо. Есть ли лучшие варианты?

Используйте enumerate когда вы хотите как значения, так и индексы в цикле for :

 for index, item in enumerate(my_list): if item.id == 'specific_id': break else: index = -1 

Или, как выражение генератора:

 index = next((i for i, item in enumerate(my_list) if item.id == 'specific_id'), -1) 

Вы можете использовать enumerate :

 for index, item in enumerate(my_list): if item.id == 'specific_id': break 

Вот альтернатива, которая не использует (явный) цикл, с двумя разными подходами к генерации списка значений «id» из исходного списка.

 try: # index = map(operator.attrgetter('id'), my_list).index('specific_id') index = [ x.id for x in my_list ].index('specific_id') except ValueError: index = -1 

Если предположить,

 a = [1,2,3,4] val = 3 

Делать

 a.index(val) if val in a else -1