Variables আর Data Structures: ML data আসলে এখানেই বসে

list, dict, tuple, set — কোন data-র জন্য কোনটা (Series 02, Episode 02)

🟢 BEGINNER Series 02 — AI Engineer-দের জন্য Python Episode 02 / 09

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: Rahim-এর প্রথম data নিয়ে মাথাব্যথা

Rahim একটা CSV file পেয়েছে — ৫০০টি job post, প্রতিটির title, company, salary, skills। সে এগুলো Python-এ আনতে চায়, কিন্তু বুঝতে পারছে না — একটা job-কে কীভাবে রাখবে? পুরো dataset-কে কীভাবে রাখবে?

Nila (data scientist) বলল:

"Rahim, ML-এ ৮০% সময় যায় data নিয়ে। আর data নিয়ে কাজ শুরু হয় একটা সহজ প্রশ্ন দিয়ে — 'এই data-টা memory-তে কোন আকারে রাখব?' ভুল structure বাছলে কোড ধীর হয়, বাগ বাড়ে। ঠিক structure বাছলে কোড ছোট, দ্রুত আর পরিষ্কার হয়।"

এই episode-এ আমরা ঠিক এটাই শিখব — AI/ML data-র চোখ দিয়ে Python-এর core data structure।

২. আসল সমস্যা: data-কে কোথায় রাখব?

ভাবুন একটা job post-এ আছে: title="ML Engineer", salary=80000, skills=["python", "sql"]। এখন প্রশ্ন — title আর salary কি একসাথে রাখব? skills কি আলাদা? একই skill দুবার থাকলে কী হবে? এসব প্রশ্নের উত্তরই আপনাকে বলে দেয় কোন data structure লাগবে।

Rule of thumb: ক্রম গুরুত্বপূর্ণ + পরিবর্তনযোগ্য → list; নাম দিয়ে খোঁজা → dict; নির্দিষ্ট, অপরিবর্তনীয় → tuple; শুধু unique জিনিস → set।

📦 ৩. variable আসলে কী (ML দৃষ্টিকোণে)

variable হলো data-র একটা নাম। কিন্তু ML-এ variable-এর দুটো বিশেষ রূপ আছে যা মনে রাখা জরুরি: feature (input, যেমন salary, experience) আর label/target (যা predict করব)। Python-এ এগুলো সাধারণ variable-ই, কিন্তু নামকরণ পরিষ্কার রাখলে পুরো ML কোড বোঝা সহজ হয়।

# ML-এ পরিষ্কার নামকরণের অভ্যাস করুন experience_years = 3 # একটা feature monthly_salary = 80000 # আরেকটা feature is_remote = True # boolean feature job_title = "ML Engineer" # text feature # Python dynamically typed: type নিজে থেকে ধরা হয় print(type(experience_years)) # <class 'int'> print(type(monthly_salary)) # <class 'int'> print(type(is_remote)) # <class 'bool'>

🧱 ৪. চারটি core data structure: list, dict, tuple, set

Structureচরিত্রML-এ ব্যবহার
listordered, mutable, duplicate allowedএকগুচ্ছ row, একটা column-এর সব value, prediction result
dictkey→value, mutable, key uniqueএকটা record (feature name → value), config, JSON data
tupleordered, immutableনির্দিষ্ট জোড়া যেমন (row, col), array shape, অপরিবর্তনীয় coordinate
setunordered, unique elementsunique skill-এর সংগ্রহ, duplicate বাদ দেওয়া, membership test
# list — একগুচ্ছ salary (order আছে, duplicate থাকতে পারে) salaries = [80000, 60000, 80000, 120000] # dict — একটা job record (নাম দিয়ে খোঁজা যায়) job = {"title": "ML Engineer", "salary": 80000, "remote": True} print(job["title"]) # ML Engineer # tuple — অপরিবর্তনীয় জোড়া (যেমন dataset shape: 500 row, 4 column) shape = (500, 4) # set — শুধু unique skill skills = {"python", "sql", "python"} # python দুবার দিলেও একবার থাকবে print(skills) # {'python', 'sql'}

🎯 ৫. তিন লেভেলে বোঝা: কোনটা কখন

Level 1 — সহজ intuition:
list = একটা লাইনে দাঁড়ানো মানুষ (ক্রম আছে)। dict = নাম-ফোন নম্বরের ডায়েরি (নাম দিয়ে খুঁজি)। tuple = সিল করা খাম (খোলা/বদলানো যায় না)। set = একটা ব্যাগে শুধু ভিন্ন ভিন্ন জিনিস (duplicate নেই)।
Level 2 — technical ভাবে:
list ও dict mutable (পরিবর্তনযোগ্য); tuple immutable। dict ও set ভেতরে hash table ব্যবহার করে, তাই "আছে কিনা" খোঁজা গড়ে O(1)। list-এ খোঁজা O(n)। এই পার্থক্য বড় data-তে বিশাল speed প্রভাব ফেলে।
Level 3 — AI Engineer-এর দৃষ্টিকোণ:
একটা record = dict; অনেক record = list of dict; JSON API response সাধারণত dict/list-এর mix। পরে এই list-of-dict-ই Pandas DataFrame-এ রূপ নেয় (Series 03)। তাই এই ভিত্তি ঠিক থাকলে Pandas অনেক সহজ লাগবে।

🖼️ ৬. Visual: একটা dataset কীভাবে বসে

Dataset (list of records) [ {"title": "ML Engineer", "salary": 80000, "skills": {"python","sql"}}, {"title": "Data Analyst", "salary": 55000, "skills": {"sql","excel"}}, {"title": "AI Engineer", "salary": 120000,"skills": {"python","rag"}}, ] │ ├── প্রতিটি {..} = একটা row = dict (feature নাম → value) ├── পুরো [ .. ] = অনেক row = list └── skills = {..} = set (unique skill)

💻 ৭. Code: এক row, অনেক row, feature dictionary

# অনেক job = list of dict (real dataset যেভাবে থাকে) jobs = [ {"title": "ML Engineer", "salary": 80000, "skills": ["python", "sql"]}, {"title": "Data Analyst", "salary": 55000, "skills": ["sql", "excel"]}, {"title": "AI Engineer", "salary": 120000, "skills": ["python", "rag"]}, ] # গড় salary বের করা total = 0 for job in jobs: total += job["salary"] average = total / len(jobs) print(f"Average salary: {average:.0f}") # Average salary: 85000 # সব unique skill (set দিয়ে duplicate বাদ) all_skills = set() for job in jobs: all_skills.update(job["skills"]) print(sorted(all_skills)) # ['excel', 'python', 'rag', 'sql']

কেন এই approach? এই list-of-dict format-ই বাস্তবে API/JSON থেকে আসে, আর সরাসরি pandas.DataFrame(jobs) দিয়ে table বানানো যায়। তাই এখনই এই pattern-এ অভ্যস্ত হওয়া লাভজনক।

৮. list vs dict — speed কেন আলাদা

একটা skill dataset-এ আছে কিনা — এটা বারবার খুঁজতে হলে list ধীর, set/dict দ্রুত। কারণ set/dict hashing ব্যবহার করে।

skills_list = ["python", "sql", "docker", "fastapi", "pytorch"] skills_set = set(skills_list) # list-এ খোঁজা: O(n) — একটা একটা করে মেলায় print("pytorch" in skills_list) # True (কিন্তু ধীর, বড় data-তে) # set-এ খোঁজা: গড়ে O(1) — সরাসরি hash print("pytorch" in skills_set) # True (দ্রুত)
Interview tip: "list-এ membership test O(n), set/dict-এ গড়ে O(1)।" — এই এক লাইন অনেক interviewer শুনতে চায়।

🧪 ৯. Experiment: mutable বনাম immutable ফাঁদ

একটা বিখ্যাত bug: list mutable, তাই একটা list অন্য variable-এ assign করলে দুটোই একই object দেখায়।

a = [1, 2, 3] b = a # b আর a একই list-কে দেখাচ্ছে! b.append(4) print(a) # [1, 2, 3, 4] <-- a-ও বদলে গেল! # সমাধান: copy করুন c = a.copy() c.append(99) print(a) # [1, 2, 3, 4] <-- এবার a অপরিবর্তিত # tuple immutable, তাই এই বিপদ নেই t = (1, 2, 3) # t.append(4) # AttributeError — tuple বদলানো যায় না

যা লক্ষ্য করবেন: ML pipeline-এ একই data অনেক জায়গায় pass হয়। এই mutable ফাঁদ না বুঝলে "data কেন নিজে নিজে বদলে গেল?" টাইপ বাগ ঘণ্টার পর ঘণ্টা খাবে।

🇧🇩 ১০. বাংলাদেশের বাস্তব context

একটা local e-commerce (যেমন Daraz-ধাঁচের) থেকে order data সাধারণত JSON-এ আসে — যা Python-এ list-of-dict। প্রতিটি order একটা dict, সব order একটা list। unique customer বের করতে set, product দাম গড় করতে list — এই চারটি structure দিয়েই দৈনন্দিন data কাজের অধিকাংশ হয়ে যায়।

👷 ১১. AI Engineer-এর দৃষ্টিকোণ

💼 ১২. Boss Question

Boss: "data structure নিয়ে এত সময় দিচ্ছ কেন? কাজ তো একটাই — result দাও।"

উত্তর: ভুল structure বাছলে code ধীর হয় ও bug বাড়ে। ১ লাখ record-এ "এই customer আগে এসেছে কিনা" list দিয়ে খুঁজলে কয়েক মিনিট, set দিয়ে খুঁজলে সেকেন্ড। মানে সঠিক structure = কম server খরচ, দ্রুত delivery, কম bug — সরাসরি business value.

🔎 ১৩. Job Requirement Decoder: "Strong Python fundamentals / Data structures"

প্রশ্নউত্তর
এর মানে কী?list/dict/tuple/set সঠিকভাবে বাছাই ও ব্যবহার করতে পারা, complexity বোঝা।
কোম্পানি কেন চায়?data নিয়ে দক্ষ ও দ্রুত কোড লিখতে; performance-সচেতন হতে।
কোন সমস্যা সমাধান করে?ধীর কোড, অপ্রয়োজনীয় memory, membership/lookup bottleneck।
junior-এর কী জানা লাগে?কোনটা কখন, mutable/immutable, list vs set lookup speed।
এখনই কী master লাগে না?custom hash, collections-এর সব advanced type, memory profiling গভীরে।
GitHub-এ কীভাবে দেখাবেন?flagship CLI-তে dict/set দিয়ে পরিষ্কার data handling।
Interview-তে কী?"list vs tuple?", "dict lookup complexity?", "duplicate কীভাবে সরাবেন?"

⚠️ ১৪. সাধারণ ভুল

ভুল ১: সবকিছুর জন্য list — ঠিক: lookup/unique দরকার হলে set/dict।

ভুল ২: b = a কে copy ভাবা — ঠিক: এটা একই object; দরকারে a.copy()

ভুল ৩: dict-এ নেই এমন key সরাসরি অ্যাক্সেস (KeyError) — ঠিক: job.get("x", default)

ভুল ৪: set-এ order আশা করা — ঠিক: set unordered; order লাগলে list বা sorted()

🎤 ১৫. Interview Prep

প্রশ্ন ১: list আর tuple-এর পার্থক্য?
উত্তর: list mutable, tuple immutable; tuple সামান্য দ্রুত ও নিরাপদ (দুর্ঘটনায় বদলায় না)।

প্রশ্ন ২: dict lookup-এর time complexity?
উত্তর: গড়ে O(1), কারণ ভেতরে hash table।

প্রশ্ন ৩: duplicate কীভাবে সরাবেন?
উত্তর: set(my_list); order দরকার হলে list(dict.fromkeys(my_list))

প্রশ্ন ৪: কখন set ব্যবহার করবেন?
উত্তর: শুধু unique জিনিস দরকার, বা দ্রুত membership test দরকার হলে।

✍️ ১৬. হাতে-কলমে (Mini Exercise)

১. একটা jobs list-of-dict বানান (৫টি job)।
২. সবচেয়ে বেশি বেতনের job-টির title বের করুন।
৩. সব job মিলিয়ে unique skill-এর একটা set বানান এবং কতটি unique skill আছে গুনুন।
৪. একটা skill (যেমন "python") কতটি job-এ আছে গুনুন।

🚀 ১৭. Project Connection

আমাদের Bangladesh Tech Career Assistant (V1)-এ প্রতিটি job হবে একটা dict, পুরো collection হবে list, আর unique skill vocabulary হবে একটা set। আজকের এই structure-ই পরে Pandas DataFrame (V2) হয়ে ML feature (V3) হবে।

📌 ১৮. সারসংক্ষেপ ও পরবর্তী পর্ব

✓ list=ordered/mutable, dict=key-value, tuple=immutable, set=unique
✓ record=dict, dataset=list of dict — যা পরে DataFrame হয়
✓ dict/set lookup গড়ে O(1), list O(n) — বড় data-তে বিশাল পার্থক্য
✓ mutable vs immutable ফাঁদ না বুঝলে "data নিজে নিজে বদলায়" টাইপ বাগ হয়
পরবর্তী Episode (S02E03): "Functions, Modules, Packages: কোড যখন notebook থেকে বড় হয়" — একই কোড বারবার না লিখে function বানানো, আর flagship project-এর প্রথম folder কাঠামো তৈরি করা।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.