如何在scala中对列表列表执行转置?

如何在scala中对列表列表执行转置?,scala,list,Scala,List,我有一个结构如下的scala列表: val list = List( List(a1,a2,a3,a4,a5), List(b1,b2,b3,b4,b5), List(c1,c2,c3,c4,c5) ) 从这个列表中,我想生成一个如下所示的列表: List( List(a1,b1,c1), List(a2,b2,c2), List(a3,b3,c3), List(a4,b4,c4), List(a5,b5,c5) ) 如何在scala中实现这一点?如果您有固定

我有一个结构如下的scala列表:

val list = List(
  List(a1,a2,a3,a4,a5),
  List(b1,b2,b3,b4,b5),
  List(c1,c2,c3,c4,c5)
)
从这个列表中,我想生成一个如下所示的列表:

List(
  List(a1,b1,c1),
  List(a2,b2,c2),
  List(a3,b3,c3),
  List(a4,b4,c4),
  List(a5,b5,c5)
)

如何在scala中实现这一点?

如果您有固定数量的此类列表,可以使用
zip
将它们压缩在一起(压缩为元组)。如您的示例所示:

scala> (List(a1,a2,a3,a4), List(b1,b2,b3,b4), List(c1,c2,c3,c4)).zipped.toList
List((a1,b1,c1),(a2,b2,c2),(a3,b3,c3),(a4,b4,c4))
如果您真的想充分利用上述功能,只需对列表进行
转换

scala> List(List(a1,a2,a3,a4), List(b1,b2,b3,b4), List(c1,c2,c3,c4)).transpose
List(List(a1,b1,c1),List(a2,b2,c2),List(a3,b3,c3),List(a4,b4,c4))

下面是库函数的手动实现

object CustomZipTest extends App{
  val list1: List[String] = List("a", "1", "w")

  val list2: List[String] = List("b", "2", "x")

  val list3: List[String] = List("c", "3", "y")

  val list4: List[String] = List("d", "4", "z")

  def customZip[T](list: List[T] *): List[List[T]] = {
    def stripOneLevel(list: Seq[List[T]]): (Seq[List[T]], List[T]) = {
      list.foldRight(Seq(): Seq[List[T]], List(): List[T]){ (e, acc) =>
        if (e.size == 1) (acc._1, e.head +: acc._2)
        else (e.tail +: acc._1, e.head +: acc._2)
      }
    }

    def strip(list: Seq[List[T]], acc: List[List[T]]): List[List[T]] = {
      list match {
        case Nil => acc
        case x+:xs =>
          val stripped = stripOneLevel(list)
          strip(stripped._1, stripped._2 +: acc)
      }
    }

    strip(list, List()).reverse
  }

  println(customZip(list1, list2, list3, list4))

}