R Scala:通过整数列表定义映射
从R(完全的新手)来到Scala 假设我有两个列表:R Scala:通过整数列表定义映射,r,scala,functional-programming,R,Scala,Functional Programming,从R(完全的新手)来到Scala 假设我有两个列表: val index = List(0,0,1,0,1) val a = List(1,2,3,4,5) 然后index可以定义从a到b:List[List[Int]]的自然映射: 1 -> b(0) 2 -> b(0) 3 -> b(1) 4 -> b(0) 5 -> b(1) 以便: b = List(List(1,2,4), List(3,5)) 一般来说,给定索引和a,在Scala中创建b
val index = List(0,0,1,0,1)
val a = List(1,2,3,4,5)
然后index
可以定义从a
到b:List[List[Int]]
的自然映射:
1 -> b(0)
2 -> b(0)
3 -> b(1)
4 -> b(0)
5 -> b(1)
以便:
b = List(List(1,2,4), List(3,5))
一般来说,给定索引
和a
,在Scala中创建b
最自然的方法是什么
e、 例如,在R中,我可以写:
run_map <- function(index, a) {
map <- function(data, i) {
data[[i]] <- a[which(index == i)]
data
}
Reduce(map, unique(index), list())
}
run\u map如果您希望一个列表包含索引,另一个列表包含值,那么您可以zip
将它们放在一起:
val myMap = (a zip b).toMap
其中a
包含索引,b
包含值
但是,如果存在重复索引,则需要执行以下操作:
for{
(i, list) <- (a zip b) groupBy (_._1)
} yield (i, list map (_._2))
用于{
(i,列表)0)给出:
这里有一种“迭代”的方法来获得解决方案:
1) “Zip”2将列表放在一起,以生成成对列表:
index.zip(a)
结果:
List[(Int, Int)] = List((0,1), (0,2), (1,3), (0,4), (1,5))
Map[Int,List[(Int, Int)]] = Map(1 -> List((1,3), (1,5)), 0 -> List((0,1), (0,2), (0,4)))
Map[Int,List[Int]] = Map(1 -> List(3, 5), 0 -> List(1, 2, 4))
2) 按列表中对的第一个元素分组
index.zip(a).groupBy(u.u 1)
结果:
List[(Int, Int)] = List((0,1), (0,2), (1,3), (0,4), (1,5))
Map[Int,List[(Int, Int)]] = Map(1 -> List((1,3), (1,5)), 0 -> List((0,1), (0,2), (0,4)))
Map[Int,List[Int]] = Map(1 -> List(3, 5), 0 -> List(1, 2, 4))
3) 通过仅从列表中的每对中投影第二个元素来删除冗余索引v
:
index.zip(a).groupBy(_._1).map{ case (i, v) => (i, v.map(_._2)) }
结果:
List[(Int, Int)] = List((0,1), (0,2), (1,3), (0,4), (1,5))
Map[Int,List[(Int, Int)]] = Map(1 -> List((1,3), (1,5)), 0 -> List((0,1), (0,2), (0,4)))
Map[Int,List[Int]] = Map(1 -> List(3, 5), 0 -> List(1, 2, 4))
b
的内容是什么?只是包含了b
的内容。希望现在已经清楚了。