我对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方法对我来说仍然很混乱。
谢谢
答案 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
// )