একটি Counter হলো একটি কন্টেইনার যা ট্র্যাক রাখে কতবার সমান ভ্যালুগুলো যোগ করা হয়েছে। পাইথন Counter ক্লাস collections মডিউলের একটি অংশ এবং ডিকশনারির সাবক্লাস।
পাইথন Counter
আমরা কাউন্টারকে একটি আনঅর্ডার্ড কালেকশন অব আইটেম হিসেবে চিন্তা করতে পারি যেখানে আইটেমগুলো ডিকশনারি কি হিসেবে সংরক্ষিত হয় এবং তাদের কাউন্ট ডিকশনারি ভ্যালু হিসেবে।
Counter আইটেমের কাউন্ট পজিটিভ, শূন্য বা নেগেটিভ ইন্টিজার হতে পারে। যদিও এর কি এবং ভ্যালুতে কোনো রেস্ট্রিকশন নেই, তবে সাধারণত ভ্যালুগুলো সংখ্যা হলে ইচ্ছিত, কিন্তু অন্যান্য অবজেক্ট টাইপও সংরক্ষণ করা যায়।
ইনিশিয়ালাইজেশন
Counter তিনটি ফর্মের ইনিশিয়ালাইজেশন সাপোর্ট করে। এর কনস্ট্রাক্টরকে আইটেমের একটি সিকোয়েন্স, কি এবং কাউন্ট ধারণকারী একটি ডিকশনারি, অথবা কিওয়ার্ড আর্গুমেন্ট ব্যবহার করে স্ট্রিং নামকে কাউন্টে ম্যাপ করে কল করা যায়।
import collections
print(collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']))
print(collections.Counter({'a': 2, 'b': 3, 'c': 1}))
print(collections.Counter(a=2, b=3, c=1))
সব তিনটি ইনিশিয়ালাইজেশন ফর্ম থেকে আউটপুট একই:
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
একটি খালি কাউন্টার তৈরি করতে, কোনো আর্গুমেন্ট ছাড়া কাউন্টার পাস করুন এবং update মেথড দিয়ে পপুলেট করুন।
import collections
c = collections.Counter()
print('Initial: ', c)
c.update('abcddcba')
print('Sequence: ', c)
c.update({'a': 1, 'd': 5})
print('Dict: ', c)
আউটপুট
Initial: Counter()
Sequence: Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2})
Dict: Counter({'d': 7, 'a': 3, 'b': 2, 'c': 2})
কাউন্ট অ্যাক্সেস করা
কাউন্টার পপুলেট হওয়ার পর, এর ভ্যালুগুলো ডিকশনারি API দিয়ে ফেচ করা যায়।
import collections
c = collections.Counter('abcddcba')
for letter in 'abcdef':
print('%s : %d' % (letter, c[letter]))
আউটপুট
a : 2 b : 2 c : 2 d : 2 e : 0 f : 0
Counter অজানা আইটেমের জন্য (উপরের প্রোগ্রামে e & f আইটেমগুলো처럼) KeyError রেইজ করে না। যদি কোনো ভ্যালু ইনপুটে দেখা না যায়, এর কাউন্ট ০ (অজানা আইটেম e & f-এর জন্য উপরের আউটপুটে)।
elements() মেথড একটি ইটেরেটর রিটার্ন করে যা Counter-এ পরিচিত সব আইটেম প্রডিউস করে।
import collections
c = collections.Counter('Python Counters')
c['z'] = 0
print(c)
print(list(c.elements()))
আউটপুট
Counter({'t': 2, 'o': 2, 'n': 2, 'P': 1, 'y': 1, 'h': 1, ' ': 1, 'C': 1, 'u': 1, 'e': 1, 'r': 1, 's': 1, 'z': 0})
['P', 'y', 't', 't', 'h', 'o', 'o', 'n', 'n', ' ', 'C', 'u', 'e', 'r', 's']
এলিমেন্টের অর্ডার ফিক্সড নয়, এবং শূন্য থেকে কম কাউন্টवाले আইটেমগুলো ইনক্লুড করা হয় না।
n ইনপুট থেকে কমন ইনপুট এবং তাদের রেসপেক্টিভ কাউন্ট প্রডিউস করতে most_common() ফাংশন ব্যবহার করা হয়।
import collections
c = collections.Counter()
texts = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'''
for word in texts:
c.update(word.rstrip().lower())
print("Five most common letters in the texts: ")
for letter, count in c.most_common(5):
print("%s: %7d" % (letter, count))
আউটপুট
Five most common letters in the texts: i: 42 e: 38 t: 32 o: 29 u: 29
উপরের উদাহরণটি টেক্সটে (বা আপনি একটি ফাইল বিবেচনা করতে পারেন) প্রদর্শিত লেটারগুলো গণনা করে একটি ফ্রিকোয়েন্সি ডিস্ট্রিবিউশন প্রডিউস করে, তারপর পাঁচটি সবচেয়ে কমন প্রিন্ট করে। most_common()-এ আর্গুমেন্ট ছাড়া কল করলে সব আইটেমের একটি লিস্ট দেবে, ফ্রিকোয়েন্সির ক্রমে।
অ্যারিথমেটিক
Counter ইনস্ট্যান্স রেজাল্ট এগরিগেট করার জন্য আ্যারিথমেটিক এবং সেট অপারেশন সাপোর্ট করে।
import collections
c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
c2 = collections.Counter('alphabet')
print('C1: ', c1)
print('C2: ', c2)
print('\nCombined counts: ')
print(c1 + c2)
print('\nSubtraction: ')
print(c1 - c2)
print('\nIntersection (taking positive minimums): ')
print(c1 & c2)
print('\nUnion (taking maximums): ')
print(c1 | c2)
আউটপুট
C1: Counter({'b': 3, 'a': 2, 'c': 1})
C2: Counter({'a': 2, 'l': 1, 'p': 1, 'h': 1, 'b': 1, 'e': 1, 't': 1})
Combined counts: Counter({'a': 4, 'b': 4, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})
Subtraction: Counter({'b': 2, 'c': 1})
Intersection (taking positive minimums): Counter({'a': 2, 'b': 1})
Union (taking maximums): Counter({'b': 3, 'a': 2, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})
প্রতিবার একটি অপারেশন দিয়ে নতুন কাউন্টার প্রডিউস হলে, শূন্য বা নেগেটিভ কাউন্টवाले যেকোনো আইটেম ডিসকার্ড করা হয়।