2012-07-30 16 views
14

Chciałbym utworzyć kolekcję z krotkami zawierającymi wszystkie pary kombinacji dwóch list. Coś jak:scala: wydajność parowania kombinacji dwóch pętli

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

W Pythonie to będzie działać, w Scala pozornie tylko for rentowności na ostatniej pętli (tak to ocenia się Unit)

Co jest najczystszym sposobem wdrożenia go w Scala?

+3

Odpowiedź Nicolas jest poprawna, ale zauważ, że 'dla' oznacza jednostkę tylko wtedy, gdy nie ma zysku. Sprawdź 'dla (x <- xs) wydajność dla (y <- ys) yield (x, y)', zwraca coś interesującego, ale nie dokładnie to, co chcesz. –

Odpowiedz

25

Byłaś prawie tam:

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

Trochę bardziej wyraźne według Nicolas:
W Scali można korzystać z wielu generatorów w jednym For-zrozumieniem.

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)) 

Można nawet ocenić w zrozumieniu.

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

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

Albo wykonać zadanie.

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

A co jeśli chciałbym zapętlić 'xs' i' ys' _and_ increment come counter 'cnt' przy każdej iteracji? Podobnie jak: 'dla (x <-xs; y <-ys; cnt ++) wydajność (x, y, cnt)'? –

+1

val concatenator = dla {X <- xs, y <- ys} yield (x, y); concatenator.zipWithIndex. Możesz spłaszczyć ten wynik, ale jest on liczony. –

+1

for- pojmowania są fajne, odkrywam je także dla siebie i naprawdę je lubię, szczególnie dzięki walidacji skilla – Alex