2016-04-13 10 views
0

Counter ile şeylerin olaylarını sayabilirsiniz. Bir şeyi uygulamak için Enum modülünden `group_by` kullanabilirsiniz düşünüyorum Doğrudan değilElixir'de bir Python Counter sayacı var mı?

>>> 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

kullanarak kendiniz oluşturabilirsiniz: Ayrıca böyle bir iterable gelen sayacı oluşturabilir Bu oldukça hızlı gibi. – JustMichael

+0

Bu neredeyse bir kopyasıdır http://stackoverflow.com/questions/36392742/group-or-count-duplicated-letters-in-elixir/36395321#36395321 – GavinBrelstaff

cevap

3

ancak Enum.reduce/3

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

Yalnızca insanlar Elixir'de boru kullanmayı çok isterler. aynı fikrin borulama ile kusurlu uygulanması: 'değerler |> String.to_char_list |> Enum.reduce (% {}, fn (x, acc) -> Map.update (acc, x, 1, & (+ 1 + 1))) son) 'Dediğim gibi, kusurludur çünkü harita karakterden ziyade karakter koduna sahiptir. Aksi halde çalışır. –

+0

Aynısını yaptım ama bunun yerine List.foldl kullandım. Bu daha mı kötü? – CrabMan

+0

Az sayıda farklı öğe varsa, List.foldl işlevini kullanmak iyidir. Bir liste biriktirdiğinizden, önceki sayımı bulmak için her geçişte tüm akümülatöre geçmeniz gerekir. Bu, harita aramalarına kıyasla verimsiz olabilir. –

İlgili konular