gpt4 book ai didi

list - 在集合中找到最频繁/常见的元素?

转载 作者:行者123 更新时间:2023-12-04 00:19:33 25 4
gpt4 key购买 nike

在集合中查找最频繁/常见元素的最佳方法是什么?例如:

list = List(1, 3, 4, 4, 2)
list.mostCommon // => 4 !! This is what I want !!


嗯。一个人可以做的是先做一个 groupBy,然后按 map进行 length,然后选择最大的一个。因此,您将获得:

Map(1 -> List(1), 4 -> List(4, 4), 3 -> List(3), 2 -> List(2))
(...)
Map(1 -> 1, 4 -> 2, 3 -> 1, 2 -> 1) // mapped by length. 4 -> 2 since there's two 4s


然后最后,选择映射到最高数字( 4)的键( 2)。 (嵌套问题:什么是最好的方法?)。但是,对于这样一个简单的操作来说,这似乎是很多工作。

有没有更好/更惯用的方式来做到这一点?

最佳答案

我必须说:

list.groupBy(identity).mapValues(_.size).maxBy(_._2)._1


要不就:

list.groupBy(identity).maxBy(_._2.size)._1


在我看来,真的没那么多工作。

如果您在只需要计数时担心为每个值建立列表的开销,可以执行以下操作:

list.foldLeft(Map.empty[Int, Int].withDefaultValue(0)) {
case (m, v) => m.updated(v, m(v) + 1)
}.maxBy(_._2)._1


甚至在运行过程中也要跟踪最大值,以免在结尾时出现多余的遍历:

list.foldLeft(
Map.empty[Int, Int].withDefaultValue(0), -1 -> Double.NegativeInfinity
) {
case ((m, (maxV, maxCount)), v) =>
val count = m(v) + 1
if (count > maxCount) (m.updated(v, count), v -> count)
else (m.updated(v, count), maxV -> maxCount)
}._2._1


不过,这显然比上面的单行代码难读,因此,我建议坚持使用它们,除非您可以证明(它们是基准测试,而不是推测)表明它们是应用程序中的瓶颈。

关于list - 在集合中找到最频繁/常见的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com