如何在Scala中将Map [Symbol,List [A]]转换为List [Map [Symbol,A]]?

时间:2014-07-31 19:12:28

标签: scala collections scala-collections

我需要转换

Map[Symbol, List[A]] to a List[Map[Symbol,A]] 

但我无法找到一小段代码(我想有一种非常紧凑的方法可以实现这一点)。

具体来说,我有一个

Map('a -> List("aa", "bb", "cc"),
    'b -> List("dd", "ee", "ff"),
    'c -> List("gg", "hh", "ii"))

我希望得到一个

List(Map('a -> "aa", 'b -> "dd", 'c -> "gg"),
    (Map('a -> "bb", 'b -> "ee", 'c -> "hh"),
    (Map('a -> "cc", 'b -> "ff", 'c -> "ii"))  

请注意,第一个集合中的所有列表都具有相同的大小。

任何帮助?

2 个答案:

答案 0 :(得分:5)

scala> val m = Map('a -> List(1,2), 'b -> List(2,3,4))
m: scala.collection.immutable.Map[Symbol,List[Int]] = Map('a -> List(1, 2),
                                                          'b -> List(2, 3, 4))

scala> m.flatMap { case (k,l) => l.map(x => Map(k -> x)) }.toList
res2: List[scala.collection.immutable.Map[Symbol,Int]] = 
      List(Map('a -> 1), Map('a -> 2), Map('b -> 2), Map('b -> 3), Map('b -> 4))

更新回答:

scala> m.map {case (k,l) => l.map(x => (k,x))}.transpose.map(_.toMap).toList
res4: List[scala.collection.immutable.Map[Symbol,String]] =
      List(Map('a -> aa, 'b -> dd, 'c -> gg),
           Map('a -> bb, 'b -> ee, 'c -> hh),
           Map('a -> cc, 'b -> ff, 'c -> ii))

答案 1 :(得分:2)

对于

val a = Map('a -> List("aa", "bb", "cc"),
            'b -> List("dd", "ee", "ff"),
            'c -> List("gg", "hh", "ii"))

zip

的方法
a.values.transpose.map { vs => (a.keys zip vs).toMap }

几乎已经提出的方法,可能稍微更惯用/简洁。

相关问题