Какой более лаконичный способ сосчитать количество раз, когда элемент возникает в списке в J?
-
05-10-2019 - |
Вопрос
Вот (вероятно наивный), я сделал это:
count =: 4: '# (# ~ = & x) y' "1 0 1
Другими словами, если я скажу 4 count 3 4 4 3 4 7 9
Результат 3
, потому что 4
Происходит 3 три раза в данном списке.
Это отлично работает, но я задаюсь вопросом, предлагает ли J предлагает еще более лаконичный способ фразу.
Решение
Когда я делаю это, зная, что у меня только когда-либо будет список, а не матрица, я использую:
count =: 4 : '+/x=y'
Или для нескольких поисков в списке:
count =: 4 : '+/x=y'"0 1
Ваш метод копирует только элементы, равные X, то считает результат. Суммирование тех, кто для равенства - одна операция.
Другие советы
Я согласен с алгоритмом, предоставленным MPelletier. Поскольку вы спрашиваете о соответствии, целостные фразы могут стоить взглянуть. Вот одна такая программа, назначенная имени:
count =: +/ @: =
Он также может быть использован в качестве анонимного глагола, как в этом примере:
4 (+/ @: =) 3 4 4 3 4 7 9
3
Синоним [: +/ =
Как сказал MPelletier, этот алгоритм работает, когда вы хотите сосчитать, - это атомы в простом списке. (Аналогичная потребность, которая потребуется другой подход, будет подсчитанным матрицам, сопоставленным в списке аналогичных матриц.)
Мы, вероятно, также должны упомянуть Член интервала 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