Si la lista contiene sólo números enteros, también se puede utilizar
import qualified Data.IntMap as I
countElems1 :: [Int] -> [(Int, Int)]
countElems1 = I.toList . foldr (\k -> I.insertWith (+) k 1) I.empty
(Recuerde que debe compilar con optimización sin embargo, de lo contrario esto será 2x más lento que el método group . sort
. Con -O2
es ligeramente más rápido en un 14%.)
también es posible usar uno de los multisetpackages que hace la función tan simple como
import qualified Math.Combinatorics.Multiset as S
countElems4 = S.toCounts . S.fromList
pero es menos eficiente.
Todas las soluciones anteriores ignoran el orden original.
Es importante pedido? Si es así, ¿cuál es el orden? Orden de la primera aparición? – sepp2k