HomeCoursesPython
Chapter 7 of 14

লিস্ট ও টাপল

Creating lists & tuples, indexing, slicing, methods & list comprehension

List তৈরি ও অ্যাক্সেস

Python-এ list হলো সবচেয়ে বেশি ব্যবহৃত ডেটা স্ট্রাকচার। এটি একটি ordered, mutable (পরিবর্তনযোগ্য) collection যেখানে বিভিন্ন টাইপের ডেটা রাখা যায়:

# List তৈরির বিভিন্ন উপায়
fruits = ["আম", "জাম", "লিচু", "কাঁঠাল"]
numbers = [10, 20, 30, 40, 50]
mixed = [1, "hello", 3.14, True, None]
empty = []

# list() constructor
chars = list("Python")   # ['P', 'y', 't', 'h', 'o', 'n']
nums = list(range(1, 6)) # [1, 2, 3, 4, 5]

print(fruits)   # ['আম', 'জাম', 'লিচু', 'কাঁঠাল']
print(len(fruits))  # 4

Indexing (ইনডেক্সিং)

List-এর প্রতিটি element-এর একটি index (অবস্থান সংখ্যা) আছে। Python-এ index 0 থেকে শুরু হয়:

Elementআমজামলিচুকাঁঠাল
Positive Index0123
Negative Index-4-3-2-1
fruits = ["আম", "জাম", "লিচু", "কাঁঠাল"]

# Positive indexing (সামনে থেকে)
print(fruits[0])    # আম (প্রথম)
print(fruits[2])    # লিচু (তৃতীয়)

# Negative indexing (পেছন থেকে)
print(fruits[-1])   # কাঁঠাল (শেষ)
print(fruits[-2])   # লিচু (শেষ থেকে দ্বিতীয়)

# মান পরিবর্তন (mutable!)
fruits[1] = "পেয়ারা"
print(fruits)  # ['আম', 'পেয়ারা', 'লিচু', 'কাঁঠাল']

List Methods

Python list-এ অনেক built-in method আছে যেগুলো list পরিবর্তন ও পরিচালনায় সাহায্য করে:

Methodকাজউদাহরণফলাফল
append(x)শেষে যোগ করেlst.append(4)[1,2,3,4]
insert(i, x)নির্দিষ্ট অবস্থানে যোগlst.insert(1, 5)[1,5,2,3]
remove(x)প্রথম মিলটি মুছে দেয়lst.remove(2)[1,3]
pop(i)index i থেকে মুছে রিটার্ন করেlst.pop(0)1 মুছে গেল
sort()ছোট থেকে বড় সাজায়lst.sort()[1,2,3]
reverse()উল্টে দেয়lst.reverse()[3,2,1]
extend(lst2)আরেকটি list যোগ করেlst.extend([4,5])[1,2,3,4,5]
index(x)x-এর index খোঁজেlst.index(2)1
count(x)x কতবার আছে গণনাlst.count(2)1
clear()সব মুছে ফেলেlst.clear()[]
# List methods উদাহরণ
students = ["রহিম", "করিম", "জামাল"]

# append — শেষে যোগ
students.append("কামাল")
print(students)  # ['রহিম', 'করিম', 'জামাল', 'কামাল']

# insert — নির্দিষ্ট অবস্থানে
students.insert(1, "সালমা")
print(students)  # ['রহিম', 'সালমা', 'করিম', 'জামাল', 'কামাল']

# remove — মান দিয়ে মুছা
students.remove("করিম")
print(students)  # ['রহিম', 'সালমা', 'জামাল', 'কামাল']

# pop — index দিয়ে মুছা ও রিটার্ন
last = students.pop()  # শেষ element মুছে
print(last)      # কামাল
print(students)  # ['রহিম', 'সালমা', 'জামাল']

# sort — সাজানো
numbers = [30, 10, 50, 20, 40]
numbers.sort()
print(numbers)   # [10, 20, 30, 40, 50]

numbers.sort(reverse=True)  # বড় থেকে ছোট
print(numbers)   # [50, 40, 30, 20, 10]
🔑 append() vs extend() vs insert()
  • append(x)একটি element শেষে যোগ করে (list দিলে nested list হয়)
  • extend(lst) — আরেকটি list-এর সব element যোগ করে (flat থাকে)
  • insert(i, x) — নির্দিষ্ট index-এ একটি element ঢোকায়
  • + operator — নতুন list তৈরি করে, মূল list অপরিবর্তিত

List Slicing

List-এর একটি অংশ বের করতে slicing ব্যবহার করা হয়। সিনট্যাক্স: list[start:stop:step]

Sliceঅর্থউদাহরণ (lst = [0,1,2,3,4,5])ফলাফল
lst[1:4]index 1 থেকে 3 পর্যন্ত[0,1,2,3,4,5][1:4][1, 2, 3]
lst[:3]শুরু থেকে index 2 পর্যন্ত[0,1,2,3,4,5][:3][0, 1, 2]
lst[2:]index 2 থেকে শেষ পর্যন্ত[0,1,2,3,4,5][2:][2, 3, 4, 5]
lst[::2]প্রতি ২য় element[0,1,2,3,4,5][::2][0, 2, 4]
lst[::-1]পুরো list উল্টো[0,1,2,3,4,5][::-1][5, 4, 3, 2, 1, 0]
lst[-3:]শেষ ৩টি element[0,1,2,3,4,5][-3:][3, 4, 5]
numbers = [10, 20, 30, 40, 50, 60, 70]

# বেসিক slicing
print(numbers[1:4])    # [20, 30, 40]
print(numbers[:3])     # [10, 20, 30]
print(numbers[3:])     # [40, 50, 60, 70]

# step ব্যবহার
print(numbers[::2])    # [10, 30, 50, 70] — প্রতি ২য়টি
print(numbers[1::2])   # [20, 40, 60] — জোড় index

# উল্টো
print(numbers[::-1])   # [70, 60, 50, 40, 30, 20, 10]

# List copy করা (shallow copy)
copy1 = numbers[:]      # slicing দিয়ে copy
copy2 = numbers.copy()  # .copy() method দিয়ে
copy3 = list(numbers)   # constructor দিয়ে

List Comprehension

List Comprehension হলো Python-এর সবচেয়ে শক্তিশালী feature-গুলোর একটি। এক লাইনে নতুন list তৈরি করতে পারবেন — loop ও condition সহ:

# সাধারণ loop দিয়ে (৪ লাইন)
squares = []
for x in range(1, 6):
    squares.append(x ** 2)
print(squares)  # [1, 4, 9, 16, 25]

# List Comprehension দিয়ে (১ লাইন!) ✅
squares = [x ** 2 for x in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

Comprehension-এ Condition

# শুধু জোড় সংখ্যা
evens = [x for x in range(1, 21) if x % 2 == 0]
print(evens)  # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# if-else সহ
labels = ["জোড়" if x % 2 == 0 else "বিজোড়" for x in range(1, 6)]
print(labels)  # ['বিজোড়', 'জোড়', 'বিজোড়', 'জোড়', 'বিজোড়']

# String processing
words = ["Hello", "World", "Python"]
lower_words = [w.lower() for w in words]
print(lower_words)  # ['hello', 'world', 'python']

# Nested comprehension — 2D list থেকে flat list
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
print(flat)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]
Patternসিনট্যাক্সউদাহরণ
বেসিক[expr for x in iterable][x*2 for x in range(5)]
Filter (if)[expr for x in iterable if cond][x for x in lst if x > 0]
Transform (if-else)[expr1 if cond else expr2 for x in iterable]["P" if x>0 else "N" for x in lst]
Nested[expr for x in iter1 for y in iter2][(i,j) for i in range(3) for j in range(3)]
💡 মনে রাখার কৌশল — Comprehension পড়ুন "উল্টো"

[x**2 for x in range(5) if x > 2] পড়ুন এভাবে: "range(5) থেকে প্রতিটি x নাও → যদি x > 2 হয় → তাহলে x**2 রাখো"। বাংলায়: কোথা থেকে → কোন শর্তে → কী করবে

Tuple (টাপল)

tuple হলো list-এর মতোই ordered collection, কিন্তু immutable (অপরিবর্তনযোগ্য) — একবার তৈরি হলে আর পরিবর্তন করা যায় না:

# Tuple তৈরি
colors = ("লাল", "সবুজ", "নীল")
single = (42,)       # একটি element-এর tuple — comma বাধ্যতামূলক!
empty_tuple = ()
from_list = tuple([1, 2, 3])

# Indexing ও Slicing (list-এর মতোই)
print(colors[0])     # লাল
print(colors[-1])    # নীল
print(colors[1:])    # ('সবুজ', 'নীল')

# কিন্তু পরিবর্তন করা যায় না!
# colors[0] = "হলুদ"  # ❌ TypeError!

Tuple Packing ও Unpacking

# Packing — একাধিক মান একটি tuple-এ
coordinates = 23.8103, 90.4125  # parentheses ছাড়াও হয়
print(coordinates)   # (23.8103, 90.4125)
print(type(coordinates))  # <class 'tuple'>

# Unpacking — tuple থেকে আলাদা ভ্যারিয়েবলে
lat, lon = coordinates
print(f"অক্ষাংশ: {lat}, দ্রাঘিমাংশ: {lon}")

# Extended unpacking (* ব্যবহার)
first, *middle, last = (1, 2, 3, 4, 5)
print(first)    # 1
print(middle)   # [2, 3, 4]
print(last)     # 5

# Swap values — Pythonic way!
a, b = 10, 20
a, b = b, a  # tuple packing/unpacking দিয়ে swap
print(a, b)  # 20 10

Tuple-এর ব্যবহারিক ক্ষেত্র

# Function থেকে একাধিক মান রিটার্ন
def min_max(numbers):
    return min(numbers), max(numbers)  # tuple রিটার্ন

smallest, largest = min_max([5, 2, 8, 1, 9])
print(f"সর্বনিম্ন: {smallest}, সর্বোচ্চ: {largest}")

# Dictionary-র key হিসেবে (list পারে না!)
locations = {
    (23.81, 90.41): "ঢাকা",
    (22.33, 91.83): "চট্টগ্রাম"
}
print(locations[(23.81, 90.41)])  # ঢাকা

List vs Tuple তুলনা

List ও Tuple দুটোই sequence, কিন্তু তাদের মধ্যে গুরুত্বপূর্ণ পার্থক্য আছে:

বৈশিষ্ট্যListTuple
সিনট্যাক্স[1, 2, 3](1, 2, 3)
Mutability✅ Mutable (পরিবর্তনযোগ্য)❌ Immutable (অপরিবর্তনযোগ্য)
গতি (Speed)তুলনামূলক ধীরতুলনামূলক দ্রুত
মেমোরিবেশি মেমোরি লাগেকম মেমোরি লাগে
Dict key❌ হতে পারে না✅ হতে পারে (hashable)
Methodsঅনেক (append, sort, etc.)শুধু count() ও index()
কখন ব্যবহারডেটা পরিবর্তন হবেডেটা স্থায়ী থাকবে
# গতি তুলনা
import sys

lst = [1, 2, 3, 4, 5]
tpl = (1, 2, 3, 4, 5)

print(f"List size: {sys.getsizeof(lst)} bytes")   # 104 bytes
print(f"Tuple size: {sys.getsizeof(tpl)} bytes")   # 80 bytes
# Tuple কম মেমোরি নেয়!
🔑 কখন কোনটি ব্যবহার করবেন?
  • List ব্যবহার করুন যখন: ডেটা যোগ/মুছতে হবে, sort করতে হবে, ডেটা পরিবর্তনশীল
  • Tuple ব্যবহার করুন যখন: ডেটা স্থায়ী (coordinates, RGB color), dictionary key, function return, নিরাপত্তা (accidental change প্রতিরোধ)
  • সন্দেহ হলে list ব্যবহার করুন — পরে tuple-এ পরিবর্তন সহজ
🧠 Quick Check
এই অধ্যায়ের উপর ৫টি প্রশ্নের উত্তর দিন
Q1. fruits = ["আম", "জাম", "লিচু"] হলে fruits[-1] এর মান কী?
✅ সঠিক উত্তর: গ) লিচু। Negative index -1 মানে list-এর শেষ element। -2 হলে "জাম", -3 হলে "আম" পাওয়া যেত।
Q2. lst = [1,2,3]; lst.append([4,5]) এর পর lst কী হবে?
✅ সঠিক উত্তর: খ) [1, 2, 3, [4, 5]]append() পুরো argument-কে একটি element হিসেবে শেষে যোগ করে। flat list চাইলে extend([4,5]) ব্যবহার করুন, তাহলে [1, 2, 3, 4, 5] পাওয়া যেত।
Q3. [x**2 for x in range(4)] এর output কী?
✅ সঠিক উত্তর: খ) [0, 1, 4, 9]range(4) = 0, 1, 2, 3। প্রতিটির বর্গ: 0²=0, 1²=1, 2²=4, 3²=9। তাই ফলাফল [0, 1, 4, 9]
Q4. Tuple-এর element পরিবর্তন করতে গেলে কী হবে?
✅ সঠিক উত্তর: খ) TypeError হবে। Tuple immutable (অপরিবর্তনযোগ্য)। tpl[0] = "new" লিখলে TypeError: 'tuple' object does not support item assignment error আসবে।
Q5. nums = [10, 20, 30, 40, 50] হলে nums[1:4] কী রিটার্ন করবে?
✅ সঠিক উত্তর: খ) [20, 30, 40]। Slicing [1:4] মানে index 1 থেকে শুরু, index 4-এর আগে থামো। তাই index 1(20), 2(30), 3(40) — মোট ৩টি element।
← Previous: লুপ Next: ডিকশনারি ও সেট →