Autor

Alejandro Alcalde

Data Scientist and Computer Scientist. Creator of this blog.

Más artículos de Alejandro Alcalde | Porfolio

Í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

¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.

Categorías:Etiquetas:

Quizá también te interese leer...