Что является более кратким способом подсчета количества раз, когда элемент встречается в списке в J? - PullRequest
3 голосов
/ 26 сентября 2010

Вот (вероятно, наивный) способ, которым я это сделал:

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

Другими словами, если я скажу 4 count 3 4 4 3 4 7 9, результат будет 3, потому что 4 происходит 3 три разав данном списке.

Это прекрасно работает, но мне интересно, предлагает ли J более краткий способ выразить это.

Ответы [ 3 ]

5 голосов
/ 26 сентября 2010

Когда я делаю это, зная, что у меня будет только список, а не матрица, я использую:

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

Или для многократного поиска в списке:

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

Ваш метод копирует только элементы, равные x, а затем подсчитывает результат.Суммирование единиц на равенство - это на одну операцию меньше.

3 голосов
/ 23 февраля 2011

Мы, вероятно, также должны упомянуть Член интервала 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
3 голосов
/ 28 сентября 2010

Я согласен с алгоритмом, предоставленным MPelletier. Так как вы просите краткости, молчаливые фразы могут стоить посмотреть. Вот одна из таких программ, присвоенных названию:

count =: +/ @: =

Его также можно использовать как анонимный глагол, как в этом примере:

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

Синоним [: +/ =

Как сказал MPelletier, этот алгоритм работает, когда нужно посчитать атомы в простом списке. (Аналогичная потребность, которая потребовала бы другого подхода, заключалась бы в подсчете матриц, сопоставленных в списке матриц одинаковой формы.)

...