Comment accéder à l'index dans un for
boucle comme celle-ci?
ints = [8, 23, 45, 12, 78]
for i in ints:
print('item #{} = {}'.format(???, i))
Je veux obtenir cette sortie:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
Lorsque je le boucle à l'aide d'une for
boucle, comment accéder à l'index de la boucle, de 1 à 5 dans ce cas?
Réponses:
L'utilisation d'une variable d'état supplémentaire, telle qu'une variable d'index (que vous utiliseriez normalement dans des langages tels que C ou PHP), est considérée comme non pythonique.
La meilleure option est d'utiliser la fonction intégrée
enumerate()
, disponible en Python 2 et 3:Consultez PEP 279 pour en savoir plus.
la source
enumerate
pas de frais généraux supplémentaires?enumerate
.Utilisez
enumerate
pour obtenir l'index avec l'élément lors de l'itération:Et notez que les index de Python commencent à zéro, vous obtiendrez donc 0 à 4 avec ce qui précède. Si vous voulez le nombre, 1 à 5, procédez comme suit:
Flux de contrôle unidiomatique
Ce que vous demandez, c'est l'équivalent Pythonic des éléments suivants, qui est l'algorithme que la plupart des programmeurs de langages de niveau inférieur utiliseraient:
Ou dans les langues qui n'ont pas de boucle pour chaque:
ou parfois plus communément (mais de manière non unidirectionnelle) trouvé en Python:
Utilisez la fonction Enumerate
La
enumerate
fonction de Python réduit l'encombrement visuel en masquant la comptabilité des index et en encapsulant l'itérable dans un autre itérable (unenumerate
objet) qui produit un tuple à deux éléments de l'index et l'élément que l'itérable d'origine fournirait. Cela ressemble à ceci:Cet exemple de code est assez bien le exemple canonique de la différence entre le code qui est idiomatique de Python et le code qui ne l'est pas. Le code idiomatique est un Python sophistiqué (mais pas compliqué), écrit de la manière dont il était destiné à être utilisé. Le code idiomatique est attendu par les concepteurs du langage, ce qui signifie que généralement ce code n'est pas seulement plus lisible, mais aussi plus efficace.
Obtenir un décompte
Même si vous n'avez pas besoin d'index au fur et à mesure, mais vous avez besoin d'un décompte des itérations (parfois souhaitables) avec lesquelles vous pouvez commencer
1
et le nombre final sera votre décompte.Le compte semble être plus ce que vous avez l'intention de demander (par opposition à l'index) lorsque vous avez dit que vous vouliez de 1 à 5.
Décomposer - une explication étape par étape
Pour décomposer ces exemples, disons que nous avons une liste d'éléments que nous voulons répéter avec un index:
Nous passons maintenant cet itérable à énumérer, créant un objet énuméré:
Nous pouvons retirer le premier élément de cet itérable que nous obtiendrions dans une boucle avec la
next
fonction:Et nous voyons que nous obtenons un tuple
0
, le premier index et'a'
le premier élément:nous pouvons utiliser ce que l'on appelle le " décompression de séquence " pour extraire les éléments de ce double-tuple:
et quand nous contrôlons
index
, nous trouvons qu'il est fait référence au premier indice, 0, etitem
fait référence au premier élément,'a'
.Conclusion
Faites donc ceci:
la source
items
est vide?[1406, 1409]
. Si j'imprime sur la console à l'aide deprint(legData)
, la sortie est [1406,1409] . Cependant, si j'essaie d'analyser les valeurs individuelles de la liste commefor idx, xLeg in enumerate(legData):
print(idx, xLeg)
, cela m'obtient une sortie d'entiers individuels tels que [, 1, 4, 0, 6, etc. par rapport aux indices 0, 1, 2, 3, 4 etc. (oui, les crochets et les virgules sont également affichés comme s'ils faisaient partie des données elles-mêmes ). Qu'est-ce qui ne va pas ici?Il est assez simple de le démarrer à partir
1
de0
:Remarque
Astuce importante, bien qu'un peu trompeuse car
index
sera untuple
(idx, item)
ici. Bon à emporter.la source
index, item
justeindex
est très trompeur, comme vous l'avez noté. Utilisez simplementfor index, item in enumerate(ints)
.la source
xrange
pour la version antérieure à 3.0.enumerate
enregistre toute logique; vous devez toujours sélectionner avec quel objet indexeri
, non?Comme c'est la norme en Python, il existe plusieurs façons de le faire. Dans tous les exemples, supposez:
lst = [1, 2, 3, 4, 5]
1. Utilisation d'énumérer ( considéré comme le plus idiomatique )
C'est aussi l'option la plus sûre à mon avis car le risque d'entrer dans une récursion infinie a été éliminé. L'élément et son index sont tous deux contenus dans des variables et il n'est pas nécessaire d'écrire de code supplémentaire pour accéder à l'élément.
2. Création d'une variable pour contenir l'index (en utilisant
for
)3. Création d'une variable pour contenir l'index (en utilisant
while
)4. Il y a toujours une autre façon
Comme expliqué précédemment, il existe d'autres moyens de le faire qui n'ont pas été expliqués ici et ils peuvent même s'appliquer davantage dans d'autres situations. par exemple en utilisant
itertools.chain
avec pour. Il gère mieux les boucles imbriquées que les autres exemples.la source
Façon à l'ancienne:
Compréhension de la liste:
la source
Le moyen le plus rapide d'accéder aux index de la liste dans la boucle en Python 2.7 est d'utiliser la méthode range pour les petites listes et la méthode énumération pour les listes de taille moyenne et énorme.
Veuillez voir les différentes approches qui peuvent être utilisées pour parcourir la liste et accéder à la valeur d'index et leurs mesures de performance (qui, je suppose, vous seraient utiles) dans les exemples de code ci-dessous:
Voir les mesures de performances pour chaque méthode ci-dessous:
En conséquence, l'utilisation de la
range
méthode est la plus rapide à répertorier avec 1000 éléments. Pour liste avec taille> 10 000 articlesenumerate
c'est le gagnant.Ajout de quelques liens utiles ci-dessous:
Quelle est la différence entre les fonctions range et xrange dans Python 2.X?
Qu'est-ce qui est plus rapide pour la boucle utilisant l'énumération ou pour la boucle utilisant xrange en Python?
plage (len (liste)) ou énumérer (liste)?
la source
Tout d'abord, les index seront de 0 à 4. Les langages de programmation commencent à compter à partir de 0; n'oubliez pas cela ou vous rencontrerez une exception d'index hors limites. Tout ce dont vous avez besoin dans la boucle for est une variable comptant de 0 à 4 comme ceci:
Gardez à l'esprit que j'ai écrit 0 à 5 car la boucle s'arrête un nombre avant le max. :)
Pour obtenir la valeur d'un index, utilisez
la source
Voici ce que vous obtenez lorsque vous accédez à l'index en
for
boucles:Résultat:
Résultat:
Résultat:
la source
Selon cette discussion: http://bytes.com/topic/python/answers/464012-objects-list-index
Itération du compteur de boucles
L'idiome actuel de bouclage sur les indices utilise la
range
fonction intégrée:La boucle sur les éléments et les indices peut être réalisée soit par l'ancien idiome, soit en utilisant la nouvelle
zip
fonction intégrée:ou
via http://www.python.org/dev/peps/pep-0212/
la source
Vous pouvez le faire avec ce code:
Utilisez ce code si vous devez réinitialiser la valeur d'index à la fin de la boucle:
la source
La meilleure solution pour ce problème est l' utilisation Énumérer en fonction build python.
énumérer retour tuple
première valeur est index
deuxième valeur est élément de tableau à cet index
la source
Dans votre question, vous écrivez "comment accéder à l'index de boucle, de 1 à 5 dans ce cas?"
Cependant, l'index d'une liste s'exécute à partir de zéro. Nous devons donc savoir si ce que vous voulez réellement est l'index et l'élément pour chaque élément d'une liste, ou si vous voulez vraiment des nombres à partir de 1. Heureusement, en Python, il est facile de faire l'un ou les deux.
Tout d'abord, pour clarifier, la
enumerate
fonction renvoie de manière itérative l'index et l'élément correspondant pour chaque élément d'une liste.La sortie de ce qui précède est alors,
Notez que l'index s'exécute à partir de 0. Ce type d'indexation est courant parmi les langages de programmation modernes, notamment Python et C.
Si vous souhaitez que votre boucle couvre une partie de la liste, vous pouvez utiliser la syntaxe Python standard pour une partie de la liste. Par exemple, pour effectuer une boucle à partir du deuxième élément d'une liste jusqu'au dernier élément, sans l'inclure, vous pouvez utiliser
Notez qu'une fois encore, l'index de sortie va de 0,
Cela nous amène au
start=n
commutateur pourenumerate()
. Cela compense simplement l'index, vous pouvez simplement ajouter un nombre à l'index à l'intérieur de la boucle.dont la sortie est
la source
Si je
nums = [1, 2, 3, 4, 5]
devais répéter je feraisOu obtenez la longueur
l = len(nums)
la source
S'il n'y a pas de valeur en double dans la liste:
la source
enumerate
. Vous devez supprimer cette réponse.Vous pouvez également essayer ceci:
La sortie est
la source
Vous pouvez utiliser la
index
méthodeEDIT Surligné dans le commentaire que cette méthode ne fonctionne pas s'il y a des doublons
ints
, la méthode ci-dessous devrait fonctionner pour toutes les valeurs deints
:Ou bien
si vous voulez obtenir à la fois l'index et la valeur dans
ints
une liste de tuples.Il utilise la méthode de
enumerate
dans la réponse sélectionnée à cette question, mais avec une compréhension de la liste, ce qui le rend plus rapide avec moins de code.la source
Réponse simple en utilisant la boucle While:
Production:
la source
Pour imprimer un tuple de (index, valeur) dans la compréhension de liste à l'aide d'une
for
boucle:Production:
la source
Cela sert bien le but:
la source
index()
recherche de la première occurrence dex
, sans mentionner le temps O ( n ^ 2 ) requis pour rechercher chaque élément.