什么是一种更简洁的方法来计算元素在J列表中出现的次数?

时间:2010-09-26 16:03:58

标签: j

这是我做过的(可能是天真的)方式:

count =: 4 : '# (#~ =&x) y'"1 0 1

换句话说,如果我说4 count 3 4 4 3 4 7 9结果为3,则因为4在给定列表中出现了3次。

这很有效,但我想知道J是否提供了一些更简洁的方法来表达这一点。

3 个答案:

答案 0 :(得分:5)

当我这样做时,知道我只会有一个列表而不是矩阵,我使用:

count =: 4 : '+/x=y'

或者列表中的多个搜索:

count =: 4 : '+/x=y'"0 1

您的方法仅复制等于x的元素,然后计算结果。总结那些相等的是一个较少的操作。

答案 1 :(得分:3)

我同意MPelletier提供的算法。既然你要求简洁,那么隐性措辞可能值得一试。这是一个这样的程序,分配给一个名字:

count =: +/ @: =

它也可以用作匿名动词,如下例所示:

   4 (+/ @: =) 3 4 4 3 4 7 9
3

同义词是[: +/ =

正如MPelletier所说,当你想要计算的是一个简单列表中的原子时,这个算法是有效的。 (需要采用不同方法的类似需求是计算类似形状矩阵列表中匹配的矩阵。)

答案 2 :(得分:3)

我们也应该提到Member of Interval E.

4 E. 3 4 4 3 4 7 9
0 1 1 0 1 0 0

+/ 4 E. 3 4 4 3 4 7 9
3

所以

f =: +/ @: E.

例如

4 f 3 4 4 3 4 7 9 
3
(1 0) f (1 0 3 2 4 1 0 3)
2