2016-04-13 3 views
0

Вы можете рассчитывать на происходящие события с помощью Counter. Кроме того, вы можете создать счетчик из итератора, как это:Есть ли аналог счетчика Питона в Эликсире?

>>> from collections import Counter 
>>> Counter("asdasdafasdasdasd") 
Counter({'a': 6, 's': 5, 'd': 5, 'f': 1}) 
>>> Counter([1,2,3,2,1,2,2,5]) 
Counter({2: 4, 1: 2, 3: 1, 5: 1}) 
+0

Я думаю, что вы можете использовать 'group_by' из модуля Enum реализовать что-то как это довольно быстро. – JustMichael

+0

Это почти дубликат http://stackoverflow.com/questions/36392742/group-or-count-duplicated-letters-in-elixir/36395321#36395321 – GavinBrelstaff

ответ

3

Не сразу, но вы можете создать его самостоятельно, используя Enum.reduce/3

Enum.reduce values, %{}, fn(x, acc) -> 
    Map.update(acc, x, 1, &(&1 + 1)) 
end 
+0

Только потому, что люди так часто хотят использовать трубопроводы в Эликсире, несовершенная реализация одной и той же идеи с помощью трубопровода: 'values ​​|> String.to_char_list |> Enum.reduce (% {}, fn (x, acc) -> Map.update (acc, x, 1, & (& 1 + 1)) end) 'Как я уже сказал, несовершенно, потому что карта имеет код символа, а не символ. В противном случае работает нормально. –

+0

Я сделал примерно то же самое, но вместо этого использовал List.foldl. Это еще хуже? – CrabMan

+0

Хорошо использовать 'List.foldl', если у вас есть небольшое количество различных элементов. Поскольку вы накапливаете список, вам нужно пройти весь аккумулятор на каждом проходе, чтобы найти предыдущий счет. Это может быть неэффективно по сравнению с поиском карт. –

Смежные вопросы