回答
如果順序並不重要工作的:
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