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) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |