scala – 像Python的itertools.groupby这样的Groupby
发布时间:2020-12-16 09:06:56  所属栏目:安全  来源:网络整理 
            导读:在 Python中,我可以使用 itertools.groupby 对具有相同键的连续元素进行分组: items = [(1,2),(1,5),3),(2,9),(3,7),4)] import itertools list(key for key,it in itertools.groupby(items,lambda tup: tup[0]))[1,2,3,1] Scala也有groupBy,但它会产生不同
                
                
                
            | 
 在 
 Python中,我可以使用 
  itertools.groupby对具有相同键的连续元素进行分组:>>> items = [(1,2),(1,5),3),(2,9),(3,7),4)] >>> import itertools >>> list(key for key,it in itertools.groupby(items,lambda tup: tup[0])) [1,2,3,1] Scala也有groupBy,但它会产生不同的结果 – 一个映射从key指向迭代中使用指定键找到的所有值(不是使用相同键的连续运行): scala> val items = List((1,4))
items: List[(Int,Int)] = List((1,4))
scala> items.groupBy {case (key,value) => key}
res0: scala.collection.immutable.Map[Int,List[(Int,Int)]] = Map(2 -> List((2,9)),1 -> List((1,4)),3 -> List((3,7)))与Python itertools.groupby一样,最有说服力的方法是什么? 解决方法
 如果您只想丢弃连续重复项,可以执行以下操作: 
  
  
  def unchain[A](items: Seq[A]) = if (items.isEmpty) items else {
  items.head +: (items zip items.drop(1)).collect{ case (l,r) if r != l => r }
}也就是说,只需将列表与移动一个位置的自身版本进行比较,并仅保留不同的项目.很容易向方法添加(相同:(a1:A,a2:A)=>布尔)参数并使用!same(l,r)如果你想要自定义行为的数量相同(例如,做到这一点)只是按键). 如果你想保留重复项,你可以使用Scala的groupBy来获得一个非常紧凑(但效率低下)的解决方案: def groupSequential(items: Seq[A])(same: (a1: A,a2: A) => Boolean) = {
  val ns = (items zip items.drop(1)).
    scanLeft(0){ (n,cc) => if (same(cc._1,cc._2)) n+1 else n }
  (ns zip items).groupBy(_._1).toSeq.sortBy(_._1).map(_._2)
}(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
