2012-07-30 11 views
14

Me gustaría crear una colección con tuplas que contengan todas las combinaciones por pares de dos listas. Algo así como:scala: cede combinaciones por pares de dos bucles

for (x <- xs) 
    for (y <- ys) 
    yield (x,y) 

En Python esto iba a funcionar, en Scala, aparentemente for rendimientos sólo para el último bucle (por lo que este se evalúa como Unit)

¿Cuál es la forma más limpia de implementarlo en Scala?

+3

La respuesta de Nicolas es la correcta, pero tenga en cuenta que 'for' se evalúa en unidades solo cuando no hay rendimiento. Comprueba 'for (x <- xs) yield para (y <- ys) yield (x, y)', devuelve algo interesante, pero no exactamente lo que quieres. –

Respuesta

25

Eras casi allí:

scala> val xs = List (1,2,3) 
xs: List[Int] = List(1, 2, 3) 

scala> val ys = List (4,5,6) 
ys: List[Int] = List(4, 5, 6) 

scala> for (x <- xs; y <- ys) yield (x,y) 
res3: List[(Int, Int)] = List((1,4), (1,5), (1,6), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6)) 
9

Un poco más explícito acuerdo con Nicolas:
En Scala se pueden utilizar varios generadores en un solo fines de comprensión.

val xs = List(1,2,3) 
val ys = List(4,5) 

for { 
    x <- xs 
    y <- ys 
} yield (x,y) 

res0: List[(Int, Int)] = List((1,4), (1,5), (2,4), (2,5), (3,4), (3,5)) 

Incluso se puede evaluar en la comprensión.

for { 
    x <- xs 
    y <- ys 
    if (x + y == 6) 
} yield (x,y) 

res1: List[(Int, Int)] = List((1,5), (2,4)) 

O haga una asignación.

for { 
    x <- xs 
    y <- ys 
    val z = x + y 
} yield (x,y,z) 

res2: List[(Int,Int,Int)] = List((1,4,5), (1,5,6), (2,4,6), (2,5,7), (3,4,7), (3,5,8)) 
+0

¿Y si quisiera hacer un bucle de 'xs' y' ys' _and_increment vienen counter 'cnt' en cada iteración? Me gusta: 'for (x <-xs; y <-ys; cnt ++) yield (x, y, cnt)'? –

+1

val concatenator = para {x <- xs, y <- ys} rendimiento (x, y); concatenator.zipWithIndex. Puede aplanar este resultado pero se cuenta. –

+1

para- las comprensiones son geniales, las estoy descubriendo por mí mismo, y realmente me gustan especialmente con las validaciones de scalaz – Alex

Cuestiones relacionadas