Dr.*_*ius 7 wolfram-mathematica
很多时候我发现自己计算出现的次数,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};
Run Code Online (Sandbox Code Playgroud)
这样
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}}
Run Code Online (Sandbox Code Playgroud)
这个功能有两个问题:
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}
Run Code Online (Sandbox Code Playgroud)
2)它不验证最后一个参数是真正的 Tallied列表还是null(尽管对我来说不那么重要)
是否有简单,优雅,快速和有效的解决方案?(我知道这些要求太多了,但希望是免费的)
也许,这会满足您的需求吗?
aggTallyAlt[listUnTallied__List : {}, listUnTallied1_List, listTallied : {{_, _Integer} ...}] :=
{#[[1, 1]], Total@#[[All, 2]]} & /@
GatherBy[Join[Tally@Join[listUnTallied, listUnTallied1], listTallied], First]
Run Code Online (Sandbox Code Playgroud)
时间要好得多,并且对最后一个arg进行了基于模式的检查.
编辑:
这是一个更快的版本:
aggTallyAlt1[listUnTallied__List : {}, listUnTallied1_List, listTallied : {{_, _Integer} ...}] :=
Transpose[{#[[All, 1, 1]], Total[#[[All, All, 2]], {2}]}] &@
GatherBy[Join[Tally@Join[listUnTallied, listUnTallied1], listTallied], First]
Run Code Online (Sandbox Code Playgroud)
它的时间安排:
In[39]:= Timing[Fold[aggTallyAlt1[Range@#2, #1] &, {}, Range[100]];]
Timing[s = {}; j = 1; While[j < 100, s = aggTallyAlt1[Range@j, s]; j++]]
Out[39]= {0.015, Null}
Out[40]= {0.016, Null}
Run Code Online (Sandbox Code Playgroud)
以下解决方案只是对原始功能的一个小修改.它Sort在使用前适用,ReplaceRepeated因此可以使用较不通用的替换模式,使其更快:
aggTally[listUnTallied__List : {}, listUnTallied1_List,
listTallied : {{_, _Integer} ...}] :=
Sort[Join[Tally@Join[listUnTallied, listUnTallied1],
listTallied]] //. {a___, {x_, p_}, {x_, q_}, c___} -> {a, {x, p + q}, c};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |