মূল কন্টেন্টে যান
মডিউল 8 · 3-এর পাঠ 4কোর্সে 31/36~12 min
মডিউল পাঠ (3/4)

সংগ্রহ: কাউন্টার এবং ডিফল্টডিক্ট

collections মডিউলটি বিশেষায়িত ডেটা প্রকার যোগ করে যা প্রসারিত করে অন্তর্নির্মিত সংগ্রহ। তিনটি সর্বাধিক ব্যবহৃত: Counter, defaultdict, namedtuple

Counter: ফ্রিকোয়েন্সি গণনা

Python
from collections import Counter

parole = ["mela", "pera", "mela", "kiwi", "mela", "pera"]
c = Counter(parole)
# Counter({'mela': 3, 'pera': 2, 'kiwi': 1})

c["mela"]            # 3
c["banana"]          # 0   (default for missing keys, NO KeyError)
c.most_common(2)     # [('mela', 3), ('pera', 2)]

এটি স্ট্রিংগুলিতেও কাজ করে (অক্ষর গণনা করে):

Python
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})

এটি গণনা (+, -, &, |) - খুব সহজে সেট-এর মত অপারেশন সমর্থন করে বিভিন্ন উত্স থেকে মোট গণনার জন্য।

defaultdict: স্বয়ংক্রিয় ডিফল্ট সহ dict

একটি নির্দেশনা যে, আপনি যখন একটি অনুপস্থিত কী অ্যাক্সেস করেন, তখন একটি কল করে এটি তৈরি করে কারখানা

Python
from collections import defaultdict

gruppi = defaultdict(list)        # factory = list (empty list)
for nome in ["Ada", "Linus", "Ada", "Grace"]:
    gruppi[nome].append(1)
# defaultdict(list, {'Ada': [1, 1], 'Linus': [1], 'Grace': [1]})

defaultdict ছাড়া, আপনাকে লিখতে হবে:

Python
gruppi = {}
for nome in [...]:
    if nome not in gruppi:
        gruppi[nome] = []
    gruppi[nome].append(1)

সাধারণ কারখানা: list, int (ডিফল্ট 0), set, dict।

namedtuple: ক্ষেত্রের নাম সহ টিপল

অপরিবর্তনীয় রেকর্ড-শ্রেণী তৈরি করার একটি হালকা উপায়। এটি একটি tuple, কিন্তু নামের মাধ্যমে ক্ষেত্রের অ্যাক্সেস সহ।

Python
from collections import namedtuple

Punto = namedtuple("Punto", ["x", "y"])
p = Punto(3, 4)
p.x          # 3 (access by name)
p[0]         # 3 (access by index, still a tuple)
p.x + p.y    # 7

# typical use: return multiple values from a function
def divisione(a, b):
    Risultato = namedtuple("Risultato", ["quoziente", "resto"])
    return Risultato(a // b, a % b)

r = divisione(17, 5)
r.quoziente   # 3
r.resto       # 2

(আরও পরিশীলিত ক্ষেত্রে 3.7 থেকে dataclasses আছে — দেখুন M9।)

nametuple: লাইটওয়েট অপরিবর্তনীয় রেকর্ড

collections মডিউলটি namedtupleও রপ্তানি করে, যা আপনাকে কনস্ট্রাক্টর বা বয়লারপ্লেট পদ্ধতি না লিখে স্ট্রাকচার্ড ডেটা সঞ্চয় করার জন্য দ্রুত লাইটওয়েট ক্লাসের মতো বস্তু তৈরি করতে দেয়:

Python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)

চেষ্টা করে দেখুন

ব্যায়াম#python.m8.l3.e1
প্রচেষ্টা: 0লোড হচ্ছে...

তালিকা দেওয়া `শব্দ = ['মেলা', 'পেরা', 'মেলা', 'কিউই', 'মেলা', 'পেরা']`, একটি স্ট্রিং হিসাবে `টপ`-এ সর্বাধিক ঘন ঘন শব্দ গণনা করুন। `শীর্ষ` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

কাউন্টার(...).most_common(1) ফেরত দেয় [(শব্দ, গণনা)]।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#python.m8.l3.e2
প্রচেষ্টা: 0লোড হচ্ছে...

ছাত্রদের `এনরোলমেন্টস = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]` প্রদত্ত, `courses_per_student` কে ডিফল্ট ডিক্ট (তালিকা) হিসাবে তৈরি করুন। `dict(courses_per_student)` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

defaultdict(তালিকা) তারপর s, c-এর জন্য তালিকাভুক্তিতে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

অতিরিক্ত চ্যালেঞ্জ

ব্যায়াম#python.m8.l3.e3
প্রচেষ্টা: 0লোড হচ্ছে...

\`সংগ্রহ\` থেকে \`কাউন্টার\` আমদানি করুন। স্ট্রিংটিতে অক্ষরের ফ্রিকোয়েন্সি গণনা করুন \`text = "abracadabra"\`। কাউন্টারটিকে \`char_counter\` এ সংরক্ষণ করুন এবং এটি মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

কাউন্টার স্ট্রিংটিকে একটি প্যারামিটার হিসাবে নেয় এবং প্রতিটি অক্ষরের উপস্থিতি গণনা করে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ