web-dev-qa-db-fra.com

Obtenir l'index dans la liste d'objets par attribut dans Python

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?

13
sebaszw

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)] 
1
Abhishek

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)
25
Joel Cornett

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
8
chepner

Vous pouvez utiliser enumerate:

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