269 votes

Équivalent du foreach en Python

Je me plonge dans Python et j'ai une question sur l'itération foreach. Je suis nouveau en Python et j'ai une certaine expérience en C#. Je me demande donc s'il existe une fonction équivalente en Python pour l'itération de tous les éléments de ma collection, par ex.

pets = ['cat', 'dog', 'fish']
marks = [ 5, 4, 3, 2, 1]

ou quelque chose comme ça.

416voto

Hannu Points 5210

Bien sûr. Une boucle d'attente.

for f in pets:
    print f

0 votes

Et si je dois aussi connaître l'indice/la clé ?

34 votes

Dans ce cas, vous devez utiliser enumerate. for k,v in enumerate(pets): etc.

1 votes

Cette construction n'est malheureusement pas intrinsèque aux collections mais plutôt externe à celles-ci. Le résultat est double : (1) elle ne peut pas être enchaînée ; (2) elle nécessite deux lignes dans le langage idiomatique Python. Python ne supporte pas un vrai foreach sur les collections directement. ou le chaînage en général. Un exemple aurait été ``myList.foreach( a => print(a)).map( lambda x : x*2)``.

40voto

Jack Aidley Points 3993

Comme ça :

for pet in pets :
  print(pet)

En fait, Python uniquement a le style foreach for boucles.

20voto

krishna Points 528

Il est également intéressant d'observer ceci

Pour itérer sur les indices d'une séquence, vous pouvez combiner les éléments suivants range() et len() comme suit :

a = ['Mary', 'had', 'a', 'little', 'lamb']
for i in range(len(a)):
  print(i, a[i])

sortie

0 Mary
1 had
2 a
3 little
4 lamb

Edit#1 : Autre moyen :

Lors du bouclage d'une séquence, l'indice de position et la valeur correspondante peuvent être récupérés en même temps à l'aide de la fonction de recherche. en utilisant la fonction enumerate() fonction.

for i, v in enumerate(['tic', 'tac', 'toe']):
  print(i, v)

sortie

0 tic
1 tac
2 toe

11voto

Robert Mennell Points 926

Pour une réponse actualisée, vous pouvez construire un forEach en Python facilement :

def forEach(list, function):
    for i, v in enumerate(list):
        function(v, i, list)

Vous pourriez également adapter cela à map , reduce , filter et toute autre fonction de tableau provenant d'un autre langage ou d'une autre précédence que vous souhaiteriez transférer. Les boucles For sont assez rapides, mais la liste de contrôle est plus longue que celle de forEach ou les autres fonctions. Vous pourriez également étendre list pour que ces fonctions aient un pointeur local vers une classe afin de pouvoir les appeler directement sur des listes.

2 votes

Pouvez-vous inclure l'utilisation s'il vous plaît ?

5voto

Marc Tanne Points 33

Bien que les réponses ci-dessus soient valables, si vous itérez sur un dict {key:value}, c'est l'approche que j'aime utiliser :

for key, value in Dictionary.items():
    print(key, value)

Par conséquent, si je voulais faire quelque chose comme stringifier toutes les clés et valeurs de mon dictionnaire, je ferais ceci :

stringified_dictionary = {}
for key, value in Dictionary.items():
    stringified_dictionary.update({str(key): str(value)})
return stringified_dictionary

Cela permet d'éviter tout problème de mutation lors de l'application de ce type d'itération, qui peut provoquer un comportement erratique (parfois) selon mon expérience.

0 votes

Une alternative plus lisible à cela est d'itérer sur un fichier copy du dictionnaire, de sorte que vous pouvez manipuler le dictionnaire pendant l'itération (bien que votre copie sera de toutes les clés et valeurs avant toute modification) -- comme for key, value in Dictionary.copy().items()

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