【问题标题】:How to transform a Map[Symbol, List[A]] to a List[Map[Symbol,A]] in Scala?如何在 Scala 中将 Map[Symbol, List[A]] 转换为 List[Map[Symbol,A]]?
【发布时间】:2014-07-31 19:12:27
【问题描述】:

我需要转换一个

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

但我找不到紧凑的 sn-p 代码来执行此操作(我想有一种非常紧凑的方法可以实现这一点)。

具体来说,我有一个

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"))  

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

有什么帮助吗?

【问题讨论】:

    标签: scala collections scala-collections


    【解决方案1】:
    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))
    

    【讨论】:

    • 我意识到我并不清楚我需要什么。我添加了更多细节和示例
    • @Max :更新了我的答案。
    【解决方案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 }
    

    与已经建议的方法差不多,也许更惯用/简洁一些。

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2019-11-20
      • 2012-09-18
      相关资源
      最近更新 更多