Muchas veces me encuentro contando las ocurrencias con Tally[ ]
y luego, una vez que descarté la lista original, tener que agregar (y unirme) a los contadores los resultados de otra lista.Agregando contadores de cuenta
lo general, esto sucede cuando estoy contando configuraciones, ocurrencias, haciendo algunas estadísticas discretas, etc.
Así que he definido una función muy simple pero muy útil para Tally agregación:
aggTally[listUnTallied__List:{},
listUnTallied1_List,
listTallied_List] :=
Join[[email protected][listUnTallied, listUnTallied1], listTallied] //.
{a___, {x_, p_}, b___, {x_, q_}, c___} -> {a, {x, p + q}, b, c};
De tal manera que
l = {x, y, z}; lt = [email protected];
n = {x};
m = {x, y, t};
aggTally[n, {}]
{{x, 1}}
aggTally[m, n, {}]
{{x, 2}, {y, 1}, {t, 1}}
aggTally[m, n, lt]
{{x, 3}, {y, 2}, {t, 1}, {z, 1}}
Esta función tiene dos problemas:
1) Rendimiento
Timing[Fold[aggTally[[email protected]#2, #1] &, {}, Range[100]];]
{23.656, Null}
(* functional equivalent to *)
Timing[s = {}; j = 1; While[j < 100, s = aggTally[[email protected], s]; j++]]
{23.047, Null}
2) No valida que el último argumento es una verdadera lista Anotó o nula (menos importante para mí, sin embargo)
¿Hay una manera simple, elegante, más rápido y una solución más efectiva? (Entiendo que estos son demasiados requisitos, pero que desean es gratuito)
¡Realmente vuela! –
Su segunda versión es MUY rápida. Parece que ReplaceRepeated [] se debe usar con mucho cuidado cuando el rendimiento es un problema. –
De hecho, 'ReplaceRepeated' se debe usar con cuidado. Tengo una pequeña sección sobre este tema en mi libro: http://www.mathprogramming-intro.org/book/node355.html. Para ver un ejemplo en el que su rendimiento es bastante bueno (debido al uso de listas vinculadas), es posible que desee ver, por ejemplo, este hilo: http://groups.google.com/group/comp.soft-sys.math.mathematica/msg/062e206f2372d899. Entonces, todo depende del patrón. Los patrones con muchos espacios en blanco son generalmente ineficaces cuando se usan con 'ReplaceRepeated'. –