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 Index | 0 | 1 | 2 | 3 |
| 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(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)] |
[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, কিন্তু তাদের মধ্যে গুরুত্বপূর্ণ পার্থক্য আছে:
| বৈশিষ্ট্য | List | Tuple |
|---|---|---|
| সিনট্যাক্স | [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-এ পরিবর্তন সহজ