加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读