44 votes

Existe-t-il un équivalent en Scala pour l'enumerate de python ?

J'aimerais avoir la commodité de

for i, line in enumerate(open(sys.argv[1])):
  print i, line

en faisant ce qui suit en Scala

for (line <- Source.fromFile(args(0)).getLines()) {
  println(line)
}

56voto

rafalotufo Points 1513

Vous pouvez utiliser le zipWithIndex à partir du trait Iterable :

for ((line, i) <- Source.fromFile(args(0)).getLines().zipWithIndex) {
   println(i, line)
}

0 votes

Merci, mais je pense que c'est : for ((line, i) <- Source.fromFile(args(0)).getLines().zipWithIndex)

0 votes

Je ne sais pas ce que fait Python, mais ceci commence avec l'index 0 et non l'index 1 pour la première ligne.

10 votes

Python fait la même chose. C'est la norme pour l'indexation des séquences. La méthode est zipWithIndex pas zipWithLineNumber

10voto

janluke Points 1319

Comme déjà répondu par d'autres, si vous voulez que votre index commence à partir de 0, vous pouvez utiliser zipWithIndex :

for ((elem, i) <- collection.zipWithIndex) {
    println(i, elem)
}

Parce que zipWithIndex crée une copie de la collection s'il est appelé sur la collection elle-même, vous pouvez l'appeler dans un fichier de type view du colleciton à la place : collection.view.zipWithIndex .

Néanmoins, l'approche de Python enumerate possède un paramètre facultatif permettant de définir la valeur de départ de votre index. En scala, vous pouvez le faire :

for ((elem, i) <- collection.zip(Stream from 1) {
    println(i, elem)
}

Pour une discussion plus longue, lisez https://alvinalexander.com/scala/how-to-use-zipwithindex-create-for-loop-counters-scala-cookbook .

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