Je parcours une liste et je souhaite imprimer l'index de l'élément s'il remplit certaines conditions. Comment je ferais ça?
Exemple:
testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
if item == 1:
print position
Hmmm. Il y avait une réponse avec une compréhension de la liste 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]
Mettre à 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 assez rapidement, nous pouvons assigner cela à 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’ai écrit FORTRAN.
Qu'en est-il de ce qui suit?
print testlist.index(element)
Si vous ne savez pas si l'élément à rechercher est réellement dans la liste, vous pouvez ajouter une vérification préliminaire, comme
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 tant parce que le code est moins clair, mais parfois plus efficace,
try:
print testlist.index(element)
except ValueError:
pass
Utilisez énumérer:
testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
if item == 1:
print position
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange au lieu de la plage demandée (voir commentaires).
Voici une autre façon de faire ceci:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Essayez le ci-dessous:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Si votre liste est suffisamment grande et que vous ne souhaitez trouver la valeur que dans un nombre d'indices fragmenté, considérez que ce code pourrait s'exécute beaucoup plus rapidement car vous n'avez pas à itérer toutes les valeurs de la liste.
lookingFor = 1
i = 0
index = 0
try:
while i < len(testlist):
index = testlist.index(lookingFor,i)
i = index + 1
print index
except ValueError: #testlist.index() cannot find lookingFor
pass
Si vous vous attendez à trouver beaucoup de valeur, vous devriez probablement simplement ajouter "index" à une liste et l'imprimer à la fin pour gagner du temps par itération.
Pourquoi compliquer les choses?
testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
if item == 1:
print position
Je pense qu'il pourrait être utile d'utiliser la méthode curselection () de la bibliothèque Tkinter:
from Tkinter import *
listbox.curselection()
Cette méthode fonctionne sur les widgets Tkinter listbox, vous devez donc en créer un au lieu d'une liste.
Cela retournera une position comme celle-ci:
('0',) (bien que les versions ultérieures de Tkinter puissent retourner une liste d'ints à la place)
Ce qui est pour la première position et le nombre changera en fonction de la position de l'article.
Pour plus d'informations, voir cette page: http://effbot.org/tkinterbook/listbox.htm
Salutations.