ডিকশনারির লিস্টে নির্দিষ্ট কি (key) এর ভ্যালুগুলো কতবার আবির্ভূত হয়েছে তা গণনা করার জন্য itertools.groupby এবং ল্যাম্বডা ফাংশন ব্যবহার করা হয়। দ্রষ্টব্য: groupby শুধু কনসেকিউটিভ (একে după একে) গ্রুপে কাজ করে, তাই প্রisb সর্ট করতে হয়।
উদাহরণ
from itertools import groupby
my_list = [
{'pyt': 13, 'fun': 44},
{'pyt': 63, 'best': 15},
{'pyt': 24, 'fun': 34},
{'pyt': 47, 'best': 64}
]
key = 'pyt'
print("ডিকশনারি লিস্ট:", my_list)
print("কি:", key)
# groupby-এর জন্য সর্ট করা জরুরি
sorted_list = sorted(my_list, key=lambda d: d[key])
# গ্রুপবাই করে কাউন্ট
result = [{k: len(list(g))} for k, g in groupby(sorted_list, key=lambda d: d[key])]
print("ফলাফল:", result)
আউটপুট
ডিকশনারি লিস্ট: [{'pyt': 13, 'fun': 44}, {'pyt': 63, 'best': 15}, {'pyt': 24, 'fun': 34}, {'pyt': 47, 'best': 64}]
কি: pyt
ফলাফল: [{13: 1}, {63: 1}, {24: 1}, {47: 1}]
এখানে সব ভ্যালু ইউনিক, তাই সবই ১ বার।
Counter ব্যবহার (সরল ও সঠিক)
from collections import Counter
values = [d[key] for d in my_list]
counts = Counter(values)
print("ভ্যালু কাউন্ট:", dict(counts))
# {13: 1, 63: 1, 24: 1, 47: 1}
# ডিকশনারি লিস্ট ফরম্যাটে
result = [{v: c} for v, c in counts.items()]
print(result)
দ্রষ্টব্য: groupby vs Counter
| পদ্ধতি | প্রয়োজনীয় সর্ট | কনসেকিউটিভ মাত্র | সব দিয়ে কাউন্ট |
|---|---|---|---|
| itertools.groupby | হ্যাঁ | হ্যাঁ | না |
| collections.Counter | না | না | হ্যাঁ |
সুপারিশ: সাধারণ কাউন্টের জন্য Counter ব্যবহার করুন। groupby তখন কাজে লাগে যখন কনসেকিউটিভ রান (run-length encoding) বুঝতে হয়।
Pandas value_counts()
import pandas as pd
df = pd.DataFrame(my_list)
print(df[key].value_counts().to_dict())