J'itère une liste et je souhaite imprimer l'index de l'élément s'il remplit une certaine condition. Comment ferais-je cela?
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 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:
D'accord, 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 facilement, nous pouvons attribuer 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'écrivais FORTRAN.
args = ['x', '-p1', 'v1', '-p2', 'v2']
. Puis la commandeargs[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]
revient'v1'
Qu'en est-il de ce qui suit?
Si vous n'êtes pas sûr que l'élément à rechercher se trouve réellement dans la liste, vous pouvez ajouter une vérification préliminaire, comme
ou
ou la "voie pythonique", que je n'aime pas tant car le code est moins clair, mais parfois plus efficace,
la source
ValueError
Utilisez enumerate:
la source
xrange au lieu de range comme demandé (voir les commentaires).
la source
xrange
est supprimée dans Python 3.x, car le nouveaurange
est l'ancienxrange
Voici une autre façon de procéder:
la source
la source
Essayez ce qui suit:
la source
Si votre liste devenait suffisamment volumineuse et que vous ne vous attendiez à trouver la valeur que dans un nombre restreint d'indices, considérez que ce code pourrait s'exécuter beaucoup plus rapidement car vous n'avez pas à itérer chaque valeur de la liste.
Si vous vous attendez à trouver beaucoup la valeur, vous devriez probablement simplement ajouter «index» à une liste et imprimer la liste à la fin pour gagner du temps par itération.
la source
Je pense qu'il pourrait être utile d'utiliser la méthode curselection () de la bibliothèque Tkinter:
Cette méthode fonctionne sur les widgets de listbox Tkinter, vous devrez donc en construire un au lieu d'une liste.
Cela renverra une position comme celle-ci:
('0',) (bien que les versions ultérieures de Tkinter puissent renvoyer une liste d'entiers à la place)
Ce qui est pour la première position et le nombre changera en fonction de la position de l'élément.
Pour plus d'informations, consultez cette page: http://effbot.org/tkinterbook/listbox.htm
Salutations.
la source
Pourquoi compliquer les choses?
la source
Juste pour illustrer un exemple complet avec le
input_list
qui asearies1
(exemple: input_list [0]) dans lequel vous voulez faire une recherche deseries2
(exemple: input_list [1]) et obtenir les index de series2 s'il existe dans series1.Remarque: votre
certain condition
ira dans l'expression lambda si les conditions sont simplesproduction:
la source
Je suppose que c'est exactement ce que vous voulez. ;-) 'id' sera toujours l'index des valeurs de la liste.
la source