188 votes

Comment obtenir la position d'un élément dans une liste ?

Je suis en train d'itérer sur une liste et je veux imprimer l'index de l'élément s'il remplit une certaine condition. Comment dois-je m'y prendre ?

Exemple :

testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
    if item == 1:
        print position

305voto

Charlie Martin Points 62306

Hmmm. Il y avait une réponse avec une liste de compréhension ici, mais elle a disparu.

Ici :

 [i for i,x in enumerate(testlist) if x == 1]

Exemple :

>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]

Mise à jour :

Ok, vous voulez une expression de générateur, nous aurons une expression de générateur. Voici à nouveau la compréhension de la liste, dans une boucle for :

>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
...     print i
... 
0
5
7

Maintenant, nous allons construire un générateur...

>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
...     print i
... 
0
5
7

et heureusement, nous pouvons l'assigner à une variable, et l'utiliser à partir de là...

>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
... 
0
5
7

Et dire que j'écrivais en FORTRAN.

0 votes

C'est la meilleure réponse ici, IMO. Elle est claire et succincte, et vous capturez réellement les valeurs d'index, donc elle est extensible (vous pouvez les imprimer, les passer à une autre fonction, etc.) La seule amélioration est d'utiliser une expression génératrice pour les cas avec de nombreuses correspondances. is.gd/brzl

9 votes

Après probablement 25 ans d'interrogations sur la programmation fonctionnelle, je pense que j'ai enfin compris. La compréhension des listes, c'est de la bombe.

0 votes

Les variables à un seul mot rendent plus difficile la compréhension de votre code, notamment dans les exemples de programmation.

203voto

mmj Points 634

Qu'en est-il des éléments suivants ?

print testlist.index(element)

Si vous n'êtes pas sûr que l'élément à rechercher se trouve effectivement dans la liste, vous pouvez ajouter une vérification préliminaire, comme par exemple

if element in testlist:
    print testlist.index(element)

ou

print(testlist.index(element) if element in testlist else None)

ou la "méthode pythonique", que je n'aime pas trop parce que le code est moins clair, mais qui est parfois plus efficace,

try:
    print testlist.index(element)
except ValueError:
    pass

7 votes

Au lieu de tester avant d'accéder, vous pourriez également essayer de vérifier que ValueError

0 votes

Je pense qu'il veut trouver toutes les occurrences, vous ne semblez donner que la première.

0 votes

@tfv Je ne vois pas comment vous pouvez arriver à une telle conclusion puisque la question dit "article" et non "articles".

43voto

zdan Points 11822

Utilisez l'expression "énumérer" :

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

11voto

jakber Points 2306
for i in xrange(len(testlist)):
  if testlist[i] == 1:
    print i

xrange au lieu de range comme demandé (voir commentaires).

0 votes

Remplacer range() par xrange() -- range() crée une liste, xrange() crée un itérateur. xrange() utilise beaucoup moins de mémoire, et l'appel initial est plus rapide.

3 votes

Je suis d'accord pour les grandes listes dans les programmes python 2. Notez que 'range' fonctionnera toujours dans python 3 (et fonctionnera comme xrange IIRC). La fonction "xrange" est en train de disparaître avec les dinosaures.

4 votes

Mise à jour : xrange est supprimée dans Python 3.x, car la nouvelle fonction range est l'ancien xrange

6voto

Phil Rankin Points 21

Voici une autre façon de procéder :

try:
   id = testlist.index('1')
   print testlist[id]
except ValueError:
   print "Not Found"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X