一个例子:
val l = List(1,2,3)
val t = List(-1,-2,-3)
我可以这样做吗?
for (i <- 0 to 10) yield (l(i)) yield (t(i))
基本上我想为每次迭代产生多个结果。
答案 0 :(得分:22)
目前还不清楚你要求的是什么 - 你期望多重收益的语义是什么。但有一件事是你可能永远不想使用索引来导航列表 - 每次调用t(i)都是O(i)来执行。
所以这是你可能要求的一种可能性
scala> val l = List(1,2,3); val t = List(-1,-2,-3)
l: List[Int] = List(1, 2, 3)
t: List[Int] = List(-1, -2, -3)
scala> val pairs = l zip t
pairs: List[(Int, Int)] = List((1,-1), (2,-2), (3,-3))
这是你可能要求的另一种可能性
scala> val crossProduct = for (x <- l; y <- t) yield (x,y)
crossProduct: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
后者只是
的语法糖scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}}
crossProduct2: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
第三种可能性是你要交错它们
scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r
interleaved: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
这是
的语法糖scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)}
interleaved2: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
答案 1 :(得分:5)
不,你不能使用多个yield子句,但有一些解决方法。例如:
for (i <- 0 to 10;
r <- List(l(i), t(i)))
yield r
当然,您可以嵌套for-comprehensions,但这会产生一系列元素列表,我不相信这是您想要的。
答案 2 :(得分:2)
收益率可以嵌套,这会导致......
for (i <- 0 to 3) yield {
for (j <- 0 to 2) yield (i,j)
}
在矢量向量中:
scala.collection.immutable.IndexedSeq[scala.collection.immutable.IndexedSeq[(Int, Int)]]
= Vector(Vector((0,0), (0,1), (0,2)), Vector((1,0), (1,1), (1,2)), Vector((2,0), (2,1), (2,2)), Vector((3,0), (3,1), (3,2)))
for (i <- 0 to 3;
j <- 0 to 2) yield (i,j)
扁平解决方案在语义上是不同的。
答案 3 :(得分:1)
这是一个类型无关的解决方案,用于未知数量的列表中未知的,不同数量的元素:
def xproduct (xx: List [List[_]]) : List [List[_]] =
xx match {
case aa :: bb :: Nil =>
aa.map (a => bb.map (b => List (a, b))).flatten
case aa :: bb :: cc =>
xproduct (bb :: cc).map (li => aa.map (a => a :: li)).flatten
case _ => xx
}
对于2个列表,它是过度设计的。你可以称之为
xproduct (List (l, t))
答案 4 :(得分:0)
显然不是。我尝试时遇到编译错误。
看起来像.. yield是一个表达式。你不能有两个收益率,因为那不是表达式的一部分。
如果要产生多个值,为什么不将它们作为元组或列表产生呢?
例如:
for( t <- List(1,2,3); l <- List(-1,-2,-3))
yield (t, l)
答案 5 :(得分:0)
也许产量不是最好的方法吗?也许这里可以使用简单的数组附加。