给出以下Scala列表:
val l = List(List("a1", "b1", "c1"), List("a2", "b2", "c2"), List("a3", "b3", "c3"))
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到:
List(("a1", "a2", "a3"), ("b1", "b2", "b3"), ("c1", "c2", "c3"))
Run Code Online (Sandbox Code Playgroud)
由于zip只能用于组合两个列表,我认为你需要以某种方式迭代/减少主列表.毫不奇怪,以下不起作用:
scala> l reduceLeft ((a, b) => a zip b)
<console>:6: error: type mismatch;
found : List[(String, String)]
required: List[String]
l reduceLeft ((a, b) => a zip b)
Run Code Online (Sandbox Code Playgroud)
有任何建议,如何做到这一点?我想我错过了一个非常简单的方法.
更新:我正在寻找一个解决方案,可以采用N个列表列表,每个列表包含M个元素,并创建M个元组列表.
更新2:事实证明,对于我的特定用例来说,最好有一个列表列表,而不是元组列表,所以我接受南瓜的回应.它也是最简单的,因为它使用本机方法.
我必须经常在Scala中转换"矩形"集合集合,例如:地图列表,列表地图,地图地图,一组列表,集合地图等.因为集合可以统一被视为从特定域到共域的映射(例如:List [A]/Array [A]是从Int域到A域的映射,Set [A]是来自A的映射域到布尔共域等),我想编写一个干净的通用函数来进行转置操作(例如:将列表映射转换为转置的映射列表).但是,我遇到了麻烦,因为除了()运算符之外,Scala似乎没有统一的API来抽象地查看集合作为映射?
所以我最终为每种类型的集合集合编写了一个单独的转置,如下所示:
def transposeMapOfLists[A,B]( mapOfLists: Map[A,List[B]] ) : List[Map[A,B]] = {
val k = ( mapOfLists keys ) toList
val l = ( k map { mapOfLists(_) } ) transpose;
l map { v => ( k zip v ) toMap }
}
def transposeListOfMaps[A,B]( listOfMaps: List[Map[A,B]]) : Map[A,List[B]] = {
val k = ( listOfMaps(0) keys ) toList
val l = ( listOfMaps map { m => k map { m(_) } } ) transpose;
( …Run Code Online (Sandbox Code Playgroud) collections transpose functional-programming scala generic-programming
我有点卡在这个问题上.我觉得我在"倒退",这让我感到困惑.
我有一个Map[Long, Seq[String]]我想转换成一个Seq[Map[Long, String]].走向另一个方向相当简单,因为我们可以将元素组合在一起,但是,我不确定如何以功能方式将它们分开.
所以,
val x = Map(1 -> List("a","b","c"), 2 -> List("d", "e"), 3 -> List("f"))
Run Code Online (Sandbox Code Playgroud)
应该成为
List(Map(1 -> "a", 2 -> "d", 3 -> "f"), Map(1 -> "b", 2 -> "e"), Map(1 -> "c"))
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用x.partition然后在每个结果元组上递归,但我不确定我要分区的内容:/
我正在用scala编写,但任何功能性答案都是受欢迎的(语言不可知).