假设我有这样的Scala列表:
val mylist = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)
如何将其转换为计数列表和元素列表?例如,我想将mylist
转换为:
val count = List(3,5,3,4)
val elements = List(2,4,5,6)
这意味着,在mylist
中,我有3次出现2次,5次出现4次等等。
在程序中,这很简单,因为我可以制作两个空列表(用于计数和元素)并在进行迭代时填充它们。但是,我不知道如何在Scala中实现这一点。
答案 0 :(得分:4)
使用.groupBy(identity)
创建Map
重新组合元素及其出现位置:
scala> val mylist = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)
mylist: List[Int] = List(4, 2, 5, 6, 4, 4, 2, 6, 5, 6, 6, 2, 5, 4, 4)
scala> mylist.groupBy(identity)
res0: scala.collection.immutable.Map[Int,List[Int]] = Map(2 -> List(2, 2, 2), 5 -> List(5, 5, 5), 4 -> List(4, 4, 4, 4, 4), 6 -> List(6, 6, 6, 6))
然后,您可以使用.mapValues(_.length)
更改'值'地图的一部分到列表的大小:
scala> mylist.groupBy(identity).mapValues(_.length)
res1: scala.collection.immutable.Map[Int,Int] = Map(2 -> 3, 5 -> 3, 4 -> 5, 6 -> 4)
如果你想从中得到2个列表,你可以使用.unzip
,它返回一个元组,第一部分是键(即元素),第二部分是值(即实例数)原始列表中的元素):
scala> val (elements, counts) = mylist.groupBy(identity).mapValues(_.length).unzip
elements: scala.collection.immutable.Iterable[Int] = List(2, 5, 4, 6)
counts: scala.collection.immutable.Iterable[Int] = List(3, 3, 5, 4)
答案 1 :(得分:4)
可以说是最短的版本:
val elements = mylist.distinct
val count = elements map (e => mylist.count(_ == e))
答案 2 :(得分:2)
一种方法是使用groupBy
,然后检查每个"组的大小":
val withSizes = mylist.groupBy(identity).toList.map { case (v, l) => (v, l.size) }
val count = withSizes.map(_._2)
val elements = withSizes.map(_._1)
答案 3 :(得分:0)
你可以尝试这样做以及做同样的替代方法。
步骤1
阶> val mylist = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)
mylist:List [Int] = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)
//使用groupBy {x => x}返回" Map [Int,List [Int]]"
步骤2
阶> mylist.groupBy(x =>(x))
res0:scala.collection.immutable.Map [Int,List [Int]] = Map(2 - > List(2,2,2),5 - > List(5,5,5),4 - >列表(4,4,4,4,4),6 - >列表(6,6,6,6))
步骤3
阶> mylist.groupBy(x =>(x))。map {case(num,times)=>(num,times.size)}。toList
res1:List [(Int,Int)] = List((2,3),(5,3),(4,5),(6,4))
步骤-4 - 按数字
排序阶> mylist.groupBy(x =>(x))。map {case(num,times)=>(num,times.size)}。toList.sortBy(_._ 1)
res2:List [(Int,Int)] = List((2,3),(4,5),(5,3),(6,4))
步骤-5 - 解压缩到列出它返回元组
阶> mylist.groupBy(x =>(x))。map {case(num,times)=>(num,times.size)}。toList.sortBy(_._ 1).unzip res3 :( List [Int],List [Int])=(List(2,4,5,6),List(3,5,3,4))