回答
如果顺序并不重要工作的:
map (\[email protected](x:_) -> (x, length xs)) . group . sort
group . sort
会给你列出的清单在那里所有相互相等的元素被分组到相同的子列表中(没有吸引子)吨,只有连续相等的元素将被分组在一起)。 map
然后将每个子列表变成一个(element, lengthOfSublist)
-tuple。
如果要按第一次出现的顺序排序,可以在排序前使用zip
向每个元素添加索引,然后在分组后,再次按该索引排序,然后删除索引。
排序可能是非常昂贵的大名单。使用KennyTM或sdcwc的解决方案来提高性能可能会更好。 – GeneralBecos 2013-05-07 17:58:09
@GeneralBecos为什么排序比创建地图要慢?两者都是'O(n log n)'。 – sepp2k 2013-05-07 18:01:25
由于假定您正在进行频率分布,因此只有最差情况下的元素数量才会与列表中元素的数量相同。在更常见的情况下,分布中元素的数量将会更小。因此,平均而言,地图将优于此类。 – GeneralBecos 2013-05-07 18:07:01
最简单的方法是将项目按顺序排序,使用“group”将它们放入相同元素的子列表中,然后对每个子列表中的项目进行计数。
map (\xs -> (head xs, length xs)) . group . sort
通过,你可以写的方式'\ XS - >(头XS,长度XS)''作为头&&& length',使用Control.Arrow模块。 – sdcvvc 2010-09-15 14:09:41
如果列表中只包含整数,你也可以使用
import qualified Data.IntMap as I
countElems1 :: [Int] -> [(Int, Int)]
countElems1 = I.toList . foldr (\k -> I.insertWith (+) k 1) I.empty
(但要记住与优化编译,否则这将是比group . sort
方法要慢2倍。随着-O2
是稍快14%)。
import qualified Math.Combinatorics.Multiset as S
countElems4 = S.toCounts . S.fromList
但效率较低。
以上所有解决方案均忽略原始顺序。
这还没有将近期速度改进容器图书馆,我敢打赌。 – 2010-09-15 00:41:34
你在说什么只是run length encoding在排序的数据:免费的在线预订真实世界哈斯克尔有一个great example of this。在通过runLengthEncoder之前,您需要对列表进行排序。
这是*不* RLE。RLE会给'[(1,2),(4,1 。),(0,1),(4,2)]' – kennytm 2010-09-15 07:00:24
@KennyTM请注意,我说:“对排序的数据”所以不太RLE但几乎与排序输入我觉得是。不是吗? – 2010-09-15 07:16:32
使用Data.Map和元组部分:
count = Map.fromListWith (+) . map (, 1)
(添加Map.toList
如果你需要一个列表。)
- 1. 计算元组列表中唯一元组的发生率
- 2. 查找列表中的唯一元素
- 3. 列表中的唯一元素(Prolog)
- 4. 计算列表中的元素python
- 5. 计算列表中的正数元素
- 6. 计算列表中的元素(haskell)
- 7. 向另一个列表中的列表添加唯一元素
- 8. 如何计算列表中元素之前的特定元素?
- 9. 按元素计算列表的大小
- 10. 的Python:将计算列表元素
- 11. perl:计算数组中的唯一元素
- 12. C++如何计算向量中的唯一元素?
- 13. 如何计算集合中的唯一元素?
- 14. 在python列表中查找元组中的唯一元素
- 15. 计算列表第一列的唯一字的总数
- 16. 有效地计算唯一元素的数量--NumPy/Python
- 17. 基于另一个列表计算嵌套列表中的元素
- 18. 如何计算表中唯一值的唯一值
- 19. 将列表中的值计算为XML元素中的值。
- 20. 如何从Scala中的类列表中提取唯一元素
- 21. 在Coq中计算列表中不同元素的数量
- 22. 如何在计算中跳过列表中的sting元素?
- 23. Scala中计算列表中元素的平均值
- 24. 查找列表中的唯一元素而不会丢失元素名称
- 25. 计算两列其中一列是唯一的
- 26. 计算函数返回true的列表中的元素
- 27. 如果匹配单元格,从日志列表中计算唯一日期
- 28. 计算列表中其他元素之间特定元素的数量
- 29. 将列表中的唯一元素排序到集合
- 30. 计算GCD - 如何检查每一个元素在列表
是为了重要吗?如果是这样的命令?第一次出现的次序? – sepp2k 2010-09-14 16:53:33