সমস্যা
একটি সিকোয়েন্সে (লিস্ট, স্ট্রিং ইত্যাদি) কোন আইটেমগুলো সবচেয়ে বেশি বার আবির্ভূত হয়েছে তা খুঁজে বের করা।
সমাধান: collections.Counter
Counter হলো একটি ডিকশনারি সাবক্লাস যা প্রতিটি কী-এর জন্য ইন্টিজার কাউন্ট রাখে। মিসিং কী খোঁজলে ডিকশনারির মতো KeyError না দিয়ে ০ রিটার্ন করে। এটি ডেটা অ্যানালিসিসের জন্য অত্যন্ত উপকারী।
from collections import Counter
# খালি কাউন্টার
c = Counter()
c['mystring'] # 0 রিটার্ন করে (এরর না)
c['mystring'] += 1
print(c) # Counter({'mystring': 1})
সিকোয়েন্স থেকে ফ্রিকোয়েন্সি গণনা
লিস্ট বা স্ট্রিং দিয়ে সরাসরি কাউন্টার তৈরি করা যায়।
text = 'Peas porridge hot peas porridge cold peas porridge in the pot nine days old'
count = Counter(text.split())
print(count)
# Counter({'porridge': 3, 'peas': 2, 'Peas': 1, 'hot': 1, ...})
most_common() মেথড
সবচেয়ে বেশি ফ্রিকোয়েন্সি वाले আইটেমগুলো পাওয়ার জন্য।
count.most_common(1) # [('porridge', 3)]
count.most_common(2) # [('porridge', 3), ('peas', 2)]
count.most_common(3) # [('porridge', 3), ('peas', 2), ('Peas', 1)]
কাউন্টার গাণিতিক অপারেশন
দুটি কাউন্টার যোগ, বিয়োগ, ইন্টারসেকশন ইত্যাদি করা যায়।
a = Counter(text.split())
b = Counter('Peas peas hot peas peas peas cold peas'.split())
a + b # কাউন্ট যোগ
a - b # কাউন্ট বিয়োগ (নেগেটিভ বা শূন্য হলে বাদ)
অন্যান্য উপকারী মেথড
elements(): সব এলিমেন্ট রিপিট করে ইটারেটর রিটার্ন করে।values(): শুধু কাউন্টগুলো।items(): (এলিমেন্ট, কাউন্ট) টাপলের লিস্ট।
Counter মাল্টিসেট (multiset) আচরণ করে এবং ডেটা খুব দক্ষতার সাথে স্টোর করে।