例:
val l = List(1,2,3)
val t = List(-1,-2,-3)
このようなことはできますか?
for (i <- 0 to 10) yield (l(i)) yield (t(i))
基本的に、反復ごとに複数の結果を生成したいと考えています。
例:
val l = List(1,2,3)
val t = List(-1,-2,-3)
このようなことはできますか?
for (i <- 0 to 10) yield (l(i)) yield (t(i))
基本的に、反復ごとに複数の結果を生成したいと考えています。
あなたが何を求めているのか、つまり複数のyieldのセマンティクスが何を期待しているのかは明確ではありません。ただし、リストをナビゲートするためにインデックスを使用することはおそらくないでしょう。 t(i) への各呼び出しは実行するのに O(i) です。
ですから、あなたが求めているかもしれない1つの可能性があります
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))
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)
いいえ、複数の yield 句を使用することはできませんが、回避策があります。例えば:
for (i <- 0 to 10;
r <- List(l(i), t(i)))
yield r
もちろん、for 内包表記を入れ子にすることもできますが、その結果、要素のリストのリストが作成されます。これは、あなたが望むものではないと思います。
利回りはネストすることができ、その結果...
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)
平坦化されたソリューションは意味的に異なります。
以下は、未知数のリスト内の未知のさまざまな数の要素に対するタイプにとらわれない解決策です。
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))
たぶん歩留まりが最善の方法ではないでしょうか?おそらく、単純な配列の追加をここで使用できます。