很多时候我发现自己会用Tally[ ]
来计算出现的次数,然后,一旦我放弃了原来的列表,不得不添加(并加入)该计数器列出来自另一个列表的结果。聚合理货计数器
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};
这样
:当我计数配置,事件,做一些离散统计等
所以我定义了理货聚集了非常简单,但好用的功能这通常发生
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}}
这个函数有两个问题:
:1)行为
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)它不验证的最后一个参数是真正计数的列表或空(对我来说不那么重要了,虽然)
有一个简单的,优雅的,更快更有效的解决方案? (据我所知,这是太多的要求,但希望是免费的)
真的很苍蝇! – 2011-02-28 15:51:03
你的第二个版本非常快。看起来性能问题时,应该非常小心地使用ReplaceRepeated []。 – 2011-02-28 16:02:16
事实上,'ReplaceRepeated'应该小心使用。在我的书中有关于这个主题的小节:http://www.mathprogramming-intro.org/book/node355.html。若要查看其性能相当不错的示例(由于使用链接列表),您可能需要查看此主题:http://groups.google.com/group/comp.soft-sys.math.mathematica/msg/062e206f2372d899。所以,这一切都取决于模式。与ReplaceRepeated一起使用时,具有许多空白的模式通常效率低下。 – 2011-02-28 16:10:56