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

StackOverflow https://stackoverflow.com/questions/3798603

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top