J'ai une liste d'objets avec l'attribut id et je veux trouver un index d'objet avec un identifiant spécifique. J'ai écrit quelque chose comme ça:
index = -1
for i in range(len(my_list)):
if my_list[i].id == 'specific_id'
index = i
break
mais ça ne semble pas très bien. Y a-t-il de meilleures options?
En supposant
a = [1,2,3,4]
val = 3
Faire
a.index(val) if val in a else -1
Pour plusieurs occurrences, selon le commentaire d'Azam ci-dessous:
[i if val == x else -1 for i,x in enumerate(a)]
Utilisez enumerate
lorsque vous voulez les valeurs et les index dans une boucle for
:
for index, item in enumerate(my_list):
if item.id == 'specific_id':
break
else:
index = -1
Ou, en tant qu'expression génératrice:
index = next((i for i, item in enumerate(my_list) if item.id == 'specific_id'), -1)
Voici une alternative qui n'utilise pas de boucle (explicite), avec deux approches différentes pour générer la liste des valeurs 'id' à partir de la liste d'origine.
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
Vous pouvez utiliser enumerate
:
for index, item in enumerate(my_list):
if item.id == 'specific_id':
break