在不同大小的向量之间映射键值

时间:2018-12-28 03:01:19

标签: scala

我对scala还是陌生的,并且很难在我的代码中使用此功能。

我正在尝试从hour_vector创建24小时的映射,并在hour_visitors向量中的特定时间有访客时填充“ visitor”值

val hour_visitors = Vector((10,100),(11,25),(16,200))
val hour_vector = Vector(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)

val map_visitors_to_hours = hour_vector.map(a => a -> hour_visitors(a)._2).toMap.withDefaultValue(0)

这不起作用,因为我正在使索引超出范围错误(这很有意义)。

但是,如果我更换:

val map_visitors_to_hours = hour_vector.map(a => a -> hour_visitors(1)._2).toMap.withDefaultValue(0)

这将映射hour_visitor的第一个索引中的每个值。

我可以将hour_index的值重新映射到列表,但这失败了,因为我在该实例中丢失了“ hour”键,并且这些值将错误地插入到24小时向量中。

仅当两个向量中都存在键并且如果1个向量中不存在键时,如何使用标准库将1个向量中的值映射到另一个向量中。

在python中,我只能在与all.x或all.y的2个数据帧上使用合并,这种scala方法对我来说仍然很混乱。

谢谢

1 个答案:

答案 0 :(得分:3)

一种方法是将hour_visitors设为Map,并使用getOrElse来获取hour_vector中小时的值,如下所示

val map_hour_visitors = hour_visitors.toMap

val map_visitors_to_hours = hour_vector.map( h =>
    (h, map_hour_visitors.getOrElse(h, 0))
  ).toMap
// map_visitors_to_hours: scala.collection.immutable.Map[Int,Int] = Map(
//   0 -> 0, 5 -> 0, 10 -> 100, 14 -> 0, 20 -> 0, 1 -> 0, 6 -> 0, 21 -> 0,
//   9 -> 0, 13 -> 0, 2 -> 0, 17 -> 0, 22 -> 0, 12 -> 0, 7 -> 0, 3 -> 0,
//  18 -> 0, 16 -> 200, 11 -> 25, 23 -> 0, 8 -> 0, 19 -> 0, 4 -> 0, 15 -> 0
// )