Índice
Cuando empecé a trabajar con scala me encontré con que me resultaba difícil resolver problemas triviales, fáciles de resolver en lenguajes que ya conocía. Supongo que esa es la parte más frustrante de aprender un lenguaje nuevo, al menos en mi opinión.
Iterar sobre varias colecciones a la vez en python
Uno de esos problemas triviales es iterar sobre dos colecciones al mismo tiempo. La forma más “pythonic” es simple:
collection1 = (1,2,3,4,5)
collection2 = ('a','b','c','d','e')
for i,j in zip(collection1, collection2):
print i,j
que resulta en:
1 a
2 b
3 c
4 d
5 e
Iterar sobre varias colecciones a la vez en scala
Ahora bien, ¿cual es la forma idiomática de hacerlo en scala?. En mi caso concreto necesitaba iterar sobre la colección y además disponer del índice del elemento actual, esto se puede conseguir con el método zipWithIndex
, y luego llamar a zipped
para convertirlos en tuplas junto a las demás colecciones sobre las que queramos iterar:
private val tree: Vector[Node] = {
val indexedWords = words.zipWithIndex
(indexedWords, tags, dep).zipped.map {
(w, t, d) =>
new Node(w._1, w._2, t, d)
}
}
En el ejemplo de arriba estoy juntando tres colecciones a la vez (indexedWords, tags, dep)
, que son del tipo ((String, Int), String, Int)
.
Antes de conocer la forma idiomática estaba iterando de este modo bastante feo:
/** Constituent tree of this sentence; includes head words */
private val tree: Vector[Node] = words.map(w => {
val i = words.indexOf(w)
new Node(w, i, tags.head, 0)
})
Estas porciones de código son parte de mi trabajo de fin de Grado, el proyecto consistía en crear un Parseo de Dependencias para el Castellano, puedes ver el proyecto completo en GitHub: NLP_Dependency_Parsing
Referencias
- Scala for loop over two lists simultaneously
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.