Tuesday, 23 September 2014

[Python] collections.Counter

Mỗi khi cần đếm, hãy dùng Counter, vì nếu bạn là sếp và đã thuê kế toán, tại sao phải ngồi đếm tiền :3

Counter là một class trong stardard library "collections" và chức năng của nó là đếm. Kết quả của việc đếm là thu được 1 dict chứa các object và số lần nó xuất hiện khi sử dụng Counter.

Nếu bạn là sếp và đã có người khác đếm hộ -> hãy bỏ qua bài này
Nếu bạn là python programmer và phải đi đếm để kiểm tiền, hãy bấm đọc tiếp :3
Counter có thể nhận argument là 1 dict chứa kết quả hoặc 1 iterable object bất kỳ (list, string ...)

In [20]: from collections import Counter

In [21]: cntr = Counter(li)

In [22]: from collections import Counter

In [30]: li = ['pikachu', 'pichu', 'pikachu', 'charizard']

In [31]: cntr = Counter(li)

In [32]: cntr
Out[32]: Counter({'pikachu': 2, 'pichu': 1, 'charizard': 1})

In [33]: li2 = ['pichu', 'togepi', 'charizard']

In [34]: cntr.update(li2)

In [35]: cntr
Out[35]: Counter({'pichu': 2, 'pikachu': 2, 'charizard': 2, 'togepi': 1})

Với counter, bạn có thể nói "em chỉ việc nằm im, còn đếm tiền để anh lo :3 "

Bản thân Counter là một subclass của dict

In [37]: issubclass(Counter, dict)
Out[37]: True
vậy nên nó có thể hoạt động như 1 dict. Tính tổng:

In [36]: sum(cntr.values())
Out[36]: 7
Update một dict:
In [38]: di2 = {'pichu': 4, 'mewth':1 }

In [39]: cntr.update(di2)

In [40]: cntr
Out[40]: Counter({'pichu': 6, 'pikachu': 2, 'charizard': 2, 'togepi': 1, 'mewth': 1})
Để vứt hết đi và làm lại từ đầu? hãy dùng clear!
In [47]: cntr.clear()

In [48]: cntr
Out[48]: Counter()
Muốn tìm top 3 developers? Hãy tưởng tượng có 4 developers "a s d f", mỗi điểm cho một developer được thể hiện bằng một chữ cái tương ứng.
In [61]: top = Counter('adsfasfasdfasdfasdfadfdfsdffff')

In [64]: top
Out[64]: Counter({'f': 11, 'd': 7, 'a': 6, 's': 6})

In [65]: top.most_common(3)
Out[65]: [('f', 11), ('d', 7), ('a', 6)]
a và s cùng được 6 điểm, nhưng ai bảo thằng s được đặt tên là s nên nó đành xếp thứ 4, thắc mắc thì về hỏi bố sao đặt tên như thế.

Đến đây đã coi như hết, python đi kèm với "batteries-included" giúp người dùng thông minh có những công cụ rất tiện tay, cần pin là đút.

Trong collections vẫn còn rất nhiều điều thú vị chờ bạn khám phá:
In [92]: print  [name for name in dir(collections) if not name.startswith('_')]
['Callable', 'Container', 'Counter', 'Hashable', 'ItemsView', 'Iterable', 'Iterator', 'KeysView', 'Mapping', 'MappingView', 'MutableMapping', 'MutableSequence', 'MutableSet', 'OrderedDict', 'Sequence', 'Set', 'Sized', 'ValuesView', 'defaultdict', 'deque', 'namedtuple']

Những đêm mất ngủ, hãy mang Counter ra đếm :3
Bye!