相关疑难解决方法(0)

我可以在Scala中一起压缩两个以上的列表吗?

给出以下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:事实证明,对于我的特定用例来说,最好有一个列表列表,而不是元组列表,所以我接受南瓜的回应.它也是最简单的,因为它使用本机方法.

zip functional-programming scala list

88
推荐指数
8
解决办法
3万
查看次数

在Scala中转置任意集合集合

我必须经常在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

9
推荐指数
1
解决办法
919
查看次数

将列表映射拆分为映射列表的功能方法

我有点卡在这个问题上.我觉得我在"倒退",这让我感到困惑.

我有一个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编写,但任何功能性答案都是受欢迎的(语言不可知).

ocaml haskell functional-programming scala

5
推荐指数
2
解决办法
645
查看次数