Python Lists: পাইথনের সবচেয়ে শক্তিশালী ডেটা স্ট্রাকচার
পাইথনে লিস্ট (List) হল একটি ক্রমিক, পরিবর্তনশীল (mutable) এবং সূচীযুক্ত (indexed) ডেটা স্ট্রাকচার। লিস্ট তৈরি করতে আমরা স্কয়ার ব্র্যাকেট [] ব্যবহার করি, এবং প্রতিটি আইটেম কমা (,) দিয়ে আলাদা করা হয়। চলুন বাংলা-ইংরেজি মিশ্রিত উদাহরণ সহ প্রতিটি ফাংশন শিখি!
Indexing: লিস্টের আইটেমগুলি অ্যাক্সেস করা
Positive Indexing
লিস্টের প্রথম আইটেমের ইনডেক্স 0, দ্বিতীয়টির 1, এবং এভাবে চলতে থাকে।
fruits = ['apple', 'banana', 'orange', 'mango'] print(fruits[0]) # Output: apple print(fruits[2]) # Output: orange
Negative Indexing
নেগেটিভ ইনডেক্সিং দিয়ে লিস্টের শেষ থেকে শুরু করা যায়। -1 হল শেষের আইটেম।
fruits = ['apple', 'banana', 'orange', 'mango'] print(fruits[-1]) # Output: mango print(fruits[-2]) # Output: orange
ইনডেক্সিং ব্যবহার করে আমরা লিস্টের যেকোনো পজিশনের আইটেম অ্যাক্সেস করতে পারি। কিন্তু মনে রাখবেন, যদি আপনি একটি নন-এক্সিস্টেন্ট ইনডেক্স অ্যাক্সেস করার চেষ্টা করেন, তাহলে পাইথন IndexError দেবে।
List Operations: কনক্যাটেনেশন, রিপিটিশন এবং মেম্বারশিপ
Concatenation (+)
দুটি লিস্ট যোগ করে একটি নতুন লিস্ট তৈরি করা হয়
list1 = [1, 2, 3] list2 = [4, 5, 6] result = list1 + list2 print(result) # [1, 2, 3, 4, 5, 6]
Repetition (*)
লিস্টকে নির্দিষ্ট সংখ্যক বার পুনরাবৃত্তি করা হয়
list1 = [1, 2] result = list1 * 3 print(result) # [1, 2, 1, 2, 1, 2]
Membership (in)
একটি আইটেম লিস্টে আছে কিনা তা চেক করা হয়
fruits = ['apple', 'banana', 'orange'] print('banana' in fruits) # True print('grape' in fruits) # False
এই অপারেশনগুলি পাইথন লিস্টের সবচেয়ে বেসিক এবং শক্তিশালী ফিচার। কনক্যাটেনেশন দিয়ে আমরা দুটি লিস্ট জোড়া লাগাতে পারি, রিপিটিশন দিয়ে একটি লিস্ট বারবার তৈরি করতে পারি, এবং মেম্বারশিপ অপারেটর দিয়ে কোন আইটেম লিস্টে উপস্থিত কিনা তা দ্রুত চেক করতে পারি।
Slicing: লিস্টের একটি অংশ বেছে নেওয়া
স্লাইসিং হল পাইথন লিস্টের সবচেয়ে কার্যকরী ফিচারগুলির মধ্যে একটি। এটি দিয়ে আমরা লিস্টের একটি নির্দিষ্ট অংশ (sub-list) নতুন লিস্ট হিসেবে তৈরি করতে পারি। স্লাইসিং সিনট্যাক্স হল list[start:stop:step]
Basic Slicing
স্টার্ট ইনডেক্স থেকে স্টপ ইনডেক্স-1 পর্যন্ত আইটেমগুলি নেওয়া হয়
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(numbers[2:6]) # [2, 3, 4, 5] print(numbers[:4]) # [0, 1, 2, 3] print(numbers[5:]) # [5, 6, 7, 8, 9]
Slicing with Step
স্টেপ প্যারামিটার দিয়ে আমরা কত ঘর পর পর আইটেম নিতে চাই তা নির্ধারণ করি
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(numbers[1:8:2]) # [1, 3, 5, 7] print(numbers[::3]) # [0, 3, 6, 9] print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
স্লাইসিং ব্যবহার করে আমরা লিস্টের যেকোনো পার্ট নতুন লিস্ট হিসেবে কপি করতে পারি। এটি মূল লিস্টকে পরিবর্তন করে না, বরং একটি নতুন লিস্ট রিটার্ন করে। নেগেটিভ স্টেপ ব্যবহার করে আমরা লিস্ট রিভার্স করতে পারি।
Traversing a List: লুপ ব্যবহার করে লিস্ট চলাচল
Using for Loop
ফর লুপ হল লিস্ট ট্রাভার্স করার সবচেয়ে সাধারণ এবং প্রাকৃতিক উপায়
fruits = ['apple', 'banana', 'orange', 'mango'] # Direct iteration for fruit in fruits: print(fruit) # Using range and len for i in range(len(fruits)): print(f"Index {i}: {fruits[i]}") # Using enumerate for i, fruit in enumerate(fruits): print(f"Index {i}: {fruit}")
Using while Loop
হোয়াইল লুপ ব্যবহার করে আমরা নির্দিষ্ট কন্ডিশন পর্যন্ত লিস্ট ট্রাভার্স করতে পারি
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] i = 0 while i < len(numbers): if numbers[i] % 2 == 0: print(f"{numbers[i]} is even") i += 1
লিস্ট ট্রাভার্স করার সময়, ফর লুপ সাধারণত পছন্দের পদ্ধতি কারণ এটি ক্লিন এবং পাইথনিক। enumerate() ফাংশন ব্যবহার করে আমরা সূচী এবং ভ্যালু দুটোই পেতে পারি। হোয়াইল লুপ তখন ব্যবহার করা হয় যখন আমাদের নির্দিষ্ট কন্ডিশন পর্যন্ত লুপ চালাতে হয় বা সূচী ম্যানুয়ালি কন্ট্রোল করতে হয়।
len() এবং list() ফাংশন
len() - লিস্টের দৈর্ঘ্য জানা
এই ফাংশন দিয়ে লিস্টে কতগুলি আইটেম আছে তা জানা যায়। এটি একটি ইন্টিজার রিটার্ন করে।
fruits = ['apple', 'banana', 'orange', 'mango'] print(len(fruits)) # Output: 4 numbers = [1, 2, 3] print(len(numbers)) # Output: 3 empty_list = [] print(len(empty_list)) # Output: 0
list() - অন্য ডেটা টাইপ থেকে লিস্ট তৈরি
এই ফাংশন দিয়ে আমরা অন্যান্য ইটারেবল ডেটা টাইপকে লিস্টে কনভার্ট করতে পারি।
# String to list text = "hello" char_list = list(text) print(char_list) # ['h', 'e', 'l', 'l', 'o'] # Tuple to list tuple_data = (1, 2, 3, 4) list_data = list(tuple_data) print(list_data) # [1, 2, 3, 4] # Range to list range_list = list(range(1, 6)) print(range_list) # [1, 2, 3, 4, 5]
len() ফাংশনটি খুবই গুরুত্বপূর্ণ কারণ এটি লিস্টের সাইজ জানতে দেয়, যা লুপিং এবং ইনডেক্সিংয়ের জন্য প্রয়োজনীয়। list() কনস্ট্রাক্টর ব্যবহার করে আমরা যেকোনো ইটারেবল (string, tuple, range, set) কে লিস্টে পরিণত করতে পারি।
Adding Elements: append(), extend(), insert()
লিস্টে নতুন আইটেম যোগ করার তিনটি ভিন্ন উপায় আছে। প্রতিটি মেথডের নিজস্ব ব্যবহার এবং পারফরম্যান্স চরিত্র আছে।
append()
একটি সিঙ্গেল আইটেম লিস্টের শেষে যোগ করে। এটি সবচেয়ে দ্রুত এবং সাধারণ মেথড।
fruits = ['apple', 'banana'] fruits.append('orange') print(fruits) # ['apple', 'banana', 'orange'] fruits.append('mango') print(fruits) # ['apple', 'banana', 'orange', 'mango']
extend()
একটি ইটারেবলের সব আইটেম লিস্টের শেষে যোগ করে। মাল্টিপল আইটেম যোগ করার জন্য ব্যবহৃত হয়।
fruits = ['apple', 'banana'] more_fruits = ['orange', 'mango'] fruits.extend(more_fruits) print(fruits) # ['apple', 'banana', 'orange', 'mango'] # Can also use with strings fruits.extend('grape') print(fruits) # ['apple', 'banana', 'orange', 'mango', 'g', 'r', 'a', 'p', 'e']
insert()
নির্দিষ্ট ইনডেক্সে একটি আইটেম ইনসার্ট করে। এটি লিস্টের অন্য আইটেমগুলিকে সরায়।
fruits = ['apple', 'orange', 'mango'] fruits.insert(1, 'banana') print(fruits) # ['apple', 'banana', 'orange', 'mango'] fruits.insert(0, 'kiwi') print(fruits) # ['kiwi', 'apple', 'banana', 'orange', 'mango']
append() সবচেয়ে দ্রুত এবং সাধারণত সবচেয়ে বেশি ব্যবহৃত হয়। extend() ব্যবহার করা হয় যখন আমাদের মাল্টিপল আইটেম যোগ করতে হয়। insert() ব্যবহার করা হয় যখন আমাদের নির্দিষ্ট পজিশনে আইটেম যোগ করতে হয়, তবে এটি ধীর কারণ এটি অন্য সব আইটেমকে সরাতে হয়।
Searching Elements: count() এবং index()
count() - একটি আইটেম কতবার আছে তা গণনা
এই মেথড দিয়ে আমরা লিস্টে একটি নির্দিষ্ট আইটেম কতবার উপস্থিত আছে তা জানতে পারি। এটি একটি ইন্টিজার রিটার্ন করে।
numbers = [1, 2, 3, 2, 4, 2, 5] print(numbers.count(2)) # Output: 3 print(numbers.count(3)) # Output: 1 print(numbers.count(6)) # Output: 0 fruits = ['apple', 'banana', 'apple', 'orange'] print(fruits.count('apple')) # Output: 2 print(fruits.count('grape')) # Output: 0
index() - একটি আইটেমের প্রথম ইনডেক্স খুঁজে বের করা
এই মেথড দিয়ে আমরা লিস্টে একটি আইটেমের প্রথম উপস্থিতির ইনডেক্স পাই। যদি আইটেম না থাকে তাহলে ValueError আসে।
fruits = ['apple', 'banana', 'orange', 'mango', 'banana'] print(fruits.index('banana')) # Output: 1 print(fruits.index('orange')) # Output: 2 print(fruits.index('apple')) # Output: 0 # Can also search in a specific range print(fruits.index('banana', 2)) # Output: 4 (searches from index 2 onwards) # This will raise ValueError # print(fruits.index('grape'))
count() দিয়ে আমরা ফ্রিকোয়েন্সি গণনা করতে পারি, যা ডেটা অ্যানালাইসিসে গুরুত্বপূর্ণ। index() দিয়ে আমরা প্রথম ম্যাচিং আইটেমের পজিশন পাই, তবে এটি এক্সেপশন হ্যান্ডলিং প্রয়োজন যদি আইটেম না থাকে।
Removing Elements: remove(), pop(), clear()
লিস্ট থেকে আইটেম রিমুভ করার বিভিন্ন উপায় আছে। প্রতিটি মেথডের নিজস্ব ব্যবহার কেস আছে।
remove()
প্রথম ম্যাচিং আইটেম রিমুভ করে। আইটেম যদি না থাকে তাহলে ValueError আসে।
fruits = ['apple', 'banana', 'orange', 'banana'] fruits.remove('banana') print(fruits) # ['apple', 'orange', 'banana'] fruits.remove('apple') print(fruits) # ['orange', 'banana']
pop()
নির্দিষ্ট ইনডেক্সের আইটেম রিমুভ করে এবং রিটার্ন করে। ডিফল্ট ইনডেক্স -1 (শেষ)।
fruits = ['apple', 'banana', 'orange', 'mango'] last_fruit = fruits.pop() print(last_fruit) # mango print(fruits) # ['apple', 'banana', 'orange'] second_fruit = fruits.pop(1) print(second_fruit) # banana print(fruits) # ['apple', 'orange']
clear()
লিস্টের সব আইটেম রিমুভ করে একটি খালি লিস্ট তৈরি করে।
fruits = ['apple', 'banana', 'orange'] fruits.clear() print(fruits) # [] numbers = [1, 2, 3, 4, 5] numbers.clear() print(numbers) # []
remove() ভ্যালু দিয়ে কাজ করে এবং প্রথম ম্যাচ রিমুভ করে। pop() ইনডেক্স দিয়ে কাজ করে এবং রিমুভড আইটেম রিটার্ন করে, যা খুব ইউজফুল। clear() সব কিছু ডিলিট করে দেয়।
Sorting and Reversing: sort(), sorted(), reverse()
sort() - মূল লিস্ট সর্ট করা
এই মেথড মূল লিস্টকে ইন-প্লেসে সর্ট করে (অর্থাৎ লিস্টটি পরিবর্তন হয়ে যায়)। এটি None রিটার্ন করে।
numbers = [3, 1, 4, 1, 5, 9, 2] numbers.sort() print(numbers) # [1, 1, 2, 3, 4, 5, 9] fruits = ['banana', 'apple', 'orange', 'mango'] fruits.sort() print(fruits) # ['apple', 'banana', 'mango', 'orange'] # Reverse sorting numbers.sort(reverse=True) print(numbers) # [9, 5, 4, 3, 2, 1, 1]
sorted() - নতুন সর্টেড লিস্ট তৈরি
এই ফাংশন মূল লিস্টকে পরিবর্তন না করে একটি নতুন সর্টেড লিস্ট রিটার্ন করে।
numbers = [3, 1, 4, 1, 5, 9, 2] sorted_numbers = sorted(numbers) print(sorted_numbers) # [1, 1, 2, 3, 4, 5, 9] print(numbers) # [3, 1, 4, 1, 5, 9, 2] (unchanged) # Reverse sorting reversed_numbers = sorted(numbers, reverse=True) print(reversed_numbers) # [9, 5, 4, 3, 2, 1, 1]
reverse() - লিস্ট উল্টো করা
এই মেথড লিস্টের আইটেমগুলিকে উল্টো ক্রমে সাজায়। ইন-প্লেসে কাজ করে।
numbers = [1, 2, 3, 4, 5] numbers.reverse() print(numbers) # [5, 4, 3, 2, 1] fruits = ['apple', 'banana', 'orange'] fruits.reverse() print(fruits) # ['orange', 'banana', 'apple']
sort() এবং sorted() উভয়ই সর্টিং করে, কিন্তু sort() মূল লিস্ট পরিবর্তন করে আর sorted() নতুন লিস্ট তৈরি করে। যদি মূল ডেটা সংরক্ষণ করা প্রয়োজন হয় তাহলে sorted() ব্যবহার করা উচিত। reverse() শুধু লিস্ট উল্টো করে দেয়, সর্ট করে না।
Made with