17

我想创建一个包含两个列表的所有成对组合的元组的集合。就像是:

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

在 Python 中这会起作用,在 Scala 中显然for只为最后一个循环产生(因此计算结果为Unit

在 Scala 中实现它的最简洁的方法是什么?

4

2 回答 2

37

你几乎在那里:

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))
于 2012-07-30T12:45:03.190 回答
11

根据 Nicolas 的说法更明确一点:
在 Scala 中,您可以在一个单一的理解中使用多个生成器。

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

您甚至可以在理解中进行评估。

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

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

或者做一个任务。

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))
于 2012-07-30T13:13:28.903 回答