Много раз я считаю, что подсчитываю вхождения с помощью Tally[ ]
, а затем, когда я отбрасываю исходный список, мне нужно добавить (и присоединиться) к этому счетчику список результатов из другого списка.
Обычно это происходит, когда я подсчитываю конфигурации, вхождения, выполняю некоторую дискретную статистику и т. Д.
Итак, я определил очень простую, но удобную функцию для агрегирования Tally:
aggTally[listUnTallied__List:{},
listUnTallied1_List,
listTallied_List] :=
Join[Tally@Join[listUnTallied, listUnTallied1], listTallied] //.
{a___, {x_, p_}, b___, {x_, q_}, c___} -> {a, {x, p + q}, b, c};
такой, что
l = {x, y, z}; lt = Tally@l;
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}}
Эта функция имеет две проблемы:
1) Производительность
Timing[Fold[aggTally[Range@#2, #1] &, {}, Range[100]];]
{23.656, Null}
(* functional equivalent to *)
Timing[s = {}; j = 1; While[j < 100, s = aggTally[Range@j, s]; j++]]
{23.047, Null}
2) Это не подтверждает, что последний аргумент является вещественным списком с подсчетом или нулем (хотя для меня это менее важно)
Есть ли простое, элегантное, быстрое и эффективное решение? (Я понимаю, что это слишком много требований, но желать можно бесплатно)