পাইথনে ডেটা স্ট্রাকচার হলো এমন কিছু উপাদান, যা ডেটা সংরক্ষণ এবং সংগঠিত করতে ব্যবহৃত হয়। এগুলো বিভিন্ন ধরনের ডেটাকে একটি নির্দিষ্ট কাঠামোর মধ্যে সাজিয়ে প্রোগ্রামিংকে সহজতর করে। পাইথনের প্রধান ডেটা স্ট্রাকচারগুলো হলো লিস্ট, টাপল, সেট, এবং ডিকশনারি।
১. লিস্ট (List)
- বর্ণনা: লিস্ট একটি পরিবর্তনযোগ্য (mutable) ডেটা স্ট্রাকচার, যেখানে এক বা একাধিক ডেটা আইটেম সংরক্ষণ করা যায়। লিস্টের মধ্যে যেকোনো ধরনের ডেটা রাখা যায় এবং এটি ইনডেক্সড হয়, অর্থাৎ প্রতিটি আইটেমের একটি নির্দিষ্ট অবস্থান থাকে।
- সিনট্যাক্স:
[]বন্ধনীর মধ্যে ডেটা লিখে লিস্ট তৈরি করা হয়।
উদাহরণ:
fruits = ["apple", "banana", "cherry"]
print(fruits[0]) # আউটপুট: apple
fruits.append("orange") # নতুন আইটেম যোগ করা
print(fruits) # আউটপুট: ["apple", "banana", "cherry", "orange"]
২. টাপল (Tuple)
- বর্ণনা: টাপল একটি অপরিবর্তনযোগ্য (immutable) ডেটা স্ট্রাকচার, যেখানে একবার আইটেম সংরক্ষণ করলে তা পরিবর্তন করা যায় না। এটি লিস্টের মতই ইনডেক্সড এবং অর্ডার মেইন্টেইন করে, তবে টাপল পরিবর্তন করা যায় না।
- সিনট্যাক্স:
()বন্ধনীর মধ্যে ডেটা লিখে টাপল তৈরি করা হয়।
উদাহরণ:
coordinates = (10, 20)
print(coordinates[0]) # আউটপুট: 10
# টাপলে কোন আইটেম যোগ করা বা পরিবর্তন করা যায় না
৩. সেট (Set)
- বর্ণনা: সেট একটি অনন্য (unique) এবং অর্ডারলেস (unordered) সংগ্রহ, যেখানে প্রতিটি আইটেম একবারই থাকে। সেটে ডুপ্লিকেট আইটেম রাখা যায় না এবং ইনডেক্সিংও সম্ভব নয়।
- সিনট্যাক্স:
{}বন্ধনীর মধ্যে ডেটা লিখে সেট তৈরি করা হয়।
উদাহরণ:
unique_numbers = {1, 2, 3, 4, 4}
print(unique_numbers) # আউটপুট: {1, 2, 3, 4}
unique_numbers.add(5) # নতুন আইটেম যোগ করা
print(unique_numbers) # আউটপুট: {1, 2, 3, 4, 5}
৪. ডিকশনারি (Dictionary)
- বর্ণনা: ডিকশনারি একটি কী-ভ্যালু (key-value) জোড়া ডেটা স্ট্রাকচার, যা মেমোরিতে ডেটা সংরক্ষণের জন্য ব্যবহার করা হয়। প্রতিটি আইটেমের একটি কী এবং তার মান থাকে। ডিকশনারির মাধ্যমে দ্রুত ডেটা খুঁজে পাওয়া যায়।
- সিনট্যাক্স:
{}বন্ধনীর মধ্যেkey: valueজোড়া লিখে ডিকশনারি তৈরি করা হয়।
উদাহরণ:
student = {
"name": "Alice",
"age": 20,
"grade": "A"
}
print(student["name"]) # আউটপুট: Alice
student["age"] = 21 # মান পরিবর্তন
print(student) # আউটপুট: {'name': 'Alice', 'age': 21, 'grade': 'A'}
ডেটা স্ট্রাকচারের তুলনা:
| ডেটা স্ট্রাকচার | ইনডেক্সিং | পরিবর্তনযোগ্যতা | ডুপ্লিকেট মান | সিনট্যাক্স |
|---|---|---|---|---|
| লিস্ট | হ্যাঁ | পরিবর্তনযোগ্য | হ্যাঁ | [] |
| টাপল | হ্যাঁ | অপরিবর্তনযোগ্য | হ্যাঁ | () |
| সেট | না | পরিবর্তনযোগ্য | না | {} |
| ডিকশনারি | কী দিয়ে | পরিবর্তনযোগ্য | কী অনন্য, মান হতে পারে | {key: value} |
সংক্ষেপে:
- লিস্ট: পরিবর্তনযোগ্য, ইনডেক্সড, এবং ডুপ্লিকেট মান গ্রহণযোগ্য।
- টাপল: অপরিবর্তনযোগ্য, ইনডেক্সড, এবং ডুপ্লিকেট মান গ্রহণযোগ্য।
- সেট: অনন্য মান সমর্থন করে এবং অর্ডারলেস।
- ডিকশনারি: কী-ভ্যালু জোড়া আকারে ডেটা সংরক্ষণ করে এবং দ্রুত অ্যাক্সেসের জন্য ব্যবহৃত হয়।
এই ডেটা স্ট্রাকচারগুলো পাইথনে ডেটা সংরক্ষণ ও সংগঠিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
পাইথনে লিস্ট (list), টিউপল (tuple), সেট (set), এবং ডিকশনারি (dictionary) হলো ডেটা সংরক্ষণের জন্য ব্যবহৃত বিভিন্ন ডেটা স্ট্রাকচার। প্রতিটি ডেটা স্ট্রাকচারের নিজস্ব বৈশিষ্ট্য এবং ব্যবহার রয়েছে। নিচে প্রতিটির সংক্ষিপ্ত পরিচয় এবং উদাহরণ দেওয়া হলো।
১. লিস্ট (List)
লিস্ট হলো একটি অর্ডারড এবং পরিবর্তনযোগ্য ডেটা স্ট্রাকচার। এটি বিভিন্ন ধরনের ডেটা সংরক্ষণ করতে পারে এবং উপাদানগুলো ইনডেক্সের মাধ্যমে অ্যাক্সেস করা যায়।
উদাহরণ:
fruits = ["apple", "banana", "cherry"]
print(fruits[1]) # আউটপুট: banana
# লিস্টে নতুন আইটেম যোগ করা
fruits.append("orange")
print(fruits) # আউটপুট: ['apple', 'banana', 'cherry', 'orange']
বৈশিষ্ট্য:
- অর্ডারড: উপাদানগুলো সিকোয়েন্স অনুযায়ী থাকে।
- পরিবর্তনযোগ্য: নতুন উপাদান যোগ বা বিদ্যমান উপাদান পরিবর্তন করা যায়।
- ডুপ্লিকেট: একই উপাদান একাধিকবার থাকতে পারে।
২. টিউপল (Tuple)
টিউপল হলো একটি অর্ডারড এবং অপরিবর্তনযোগ্য ডেটা স্ট্রাকচার। একবার তৈরি করলে এর উপাদানগুলো পরিবর্তন করা যায় না।
উদাহরণ:
colors = ("red", "green", "blue")
print(colors[0]) # আউটপুট: red
বৈশিষ্ট্য:
- অর্ডারড: উপাদানগুলো সিকোয়েন্স অনুযায়ী থাকে।
- অপরিবর্তনযোগ্য: নতুন উপাদান যোগ বা বিদ্যমান উপাদান পরিবর্তন করা যায় না।
- ডুপ্লিকেট: একই উপাদান একাধিকবার থাকতে পারে।
৩. সেট (Set)
সেট হলো একটি আনঅর্ডারড এবং ইউনিক (অদ্বিতীয়) উপাদানের সংগ্রহ, যেখানে ডুপ্লিকেট উপাদান রাখা যায় না।
উদাহরণ:
numbers = {1, 2, 3, 4, 4}
print(numbers) # আউটপুট: {1, 2, 3, 4}
# নতুন আইটেম যোগ করা
numbers.add(5)
print(numbers) # আউটপুট: {1, 2, 3, 4, 5}
বৈশিষ্ট্য:
- আনঅর্ডারড: উপাদানগুলোর নির্দিষ্ট ক্রম থাকে না।
- ইউনিক আইটেম: একই উপাদান একাধিকবার থাকতে পারে না।
- পরিবর্তনযোগ্য: নতুন উপাদান যোগ বা বিদ্যমান উপাদান মুছে ফেলা যায়।
৪. ডিকশনারি (Dictionary)
ডিকশনারি হলো একটি কী-ভ্যালু পেয়ার ভিত্তিক ডেটা স্ট্রাকচার, যেখানে প্রতিটি কী এর সাথে একটি মান যুক্ত থাকে।
উদাহরণ:
person = {
"name": "Alice",
"age": 25,
"city": "New York"
}
print(person["name"]) # আউটপুট: Alice
# নতুন কী-ভ্যালু পেয়ার যোগ করা
person["job"] = "Engineer"
print(person) # আউটপুট: {'name': 'Alice', 'age': 25, 'city': 'New York', 'job': 'Engineer'}
বৈশিষ্ট্য:
- কি-ভ্যালু পেয়ার: ডিকশনারিতে প্রতিটি উপাদান একটি কী এবং তার মান নিয়ে গঠিত।
- অর্ডারড (Python 3.7+): উপাদানগুলো সিকোয়েন্স অনুযায়ী থাকে।
- পরিবর্তনযোগ্য: নতুন কী-ভ্যালু পেয়ার যোগ বা বিদ্যমান মান পরিবর্তন করা যায়।
- ইউনিক কী: প্রতিটি কী অনন্য হতে হবে, তবে মান একই থাকতে পারে।
সংক্ষিপ্ত তুলনা
| ডেটা স্ট্রাকচার | অর্ডারড | পরিবর্তনযোগ্য | ডুপ্লিকেট | কী-ভ্যালু পেয়ার |
|---|---|---|---|---|
| লিস্ট | হ্যাঁ | হ্যাঁ | হ্যাঁ | না |
| টিউপল | হ্যাঁ | না | হ্যাঁ | না |
| সেট | না | হ্যাঁ | না | না |
| ডিকশনারি | হ্যাঁ | হ্যাঁ | কেবল মান | হ্যাঁ |
এই ডেটা স্ট্রাকচারগুলো পাইথনে বিভিন্ন ধরনের ডেটা ম্যানেজমেন্ট এবং ম্যানিপুলেশনে সাহায্য করে।
লিস্ট কম্প্রিহেনশন (List Comprehension) পাইথনের একটি সংক্ষিপ্ত এবং কার্যকর উপায়, যা একটি নতুন লিস্ট তৈরি করার জন্য ব্যবহৃত হয়। এটি লুপ এবং কন্ডিশনাল স্টেটমেন্ট ব্যবহার করে এক বা একাধিক লিস্ট থেকে নতুন লিস্ট তৈরি করতে পারে। লিস্ট কম্প্রিহেনশন কোডকে আরও সংক্ষিপ্ত ও সহজ করে তোলে।
লিস্ট কম্প্রিহেনশনের সাধারণ সিনট্যাক্স:
new_list = [expression for item in iterable if condition]
- expression: প্রতিটি আইটেমে প্রয়োগ করা হয় এবং এটি নতুন লিস্টে যোগ করা হয়।
- item: লুপের প্রতিটি আইটেমের জন্য একটি ভেরিয়েবল।
- iterable: যেকোনো ইটারেবল অবজেক্ট যেমন লিস্ট, রেঞ্জ ইত্যাদি।
- condition: ঐচ্ছিক (optional) শর্ত, যা শুধুমাত্র শর্ত পূরণকারী আইটেমগুলোকে নতুন লিস্টে যোগ করে।
উদাহরণ ১: সাধারণ লিস্ট কম্প্রিহেনশন
ধরা যাক, আমাদের ১ থেকে ১০ পর্যন্ত সংখ্যাগুলোর একটি লিস্ট তৈরি করতে হবে।
numbers = [x for x in range(1, 11)]
print(numbers)
আউটপুট:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
উদাহরণ ২: একটি শর্ত সহ লিস্ট কম্প্রিহেনশন
১ থেকে ১০ পর্যন্ত সংখ্যাগুলোর মধ্যে শুধুমাত্র জোড় সংখ্যাগুলোকে নতুন লিস্টে যোগ করতে চাই।
even_numbers = [x for x in range(1, 11) if x % 2 == 0]
print(even_numbers)
আউটপুট:
[2, 4, 6, 8, 10]
উদাহরণ ৩: প্রতিটি আইটেমের উপর অপারেশন প্রয়োগ করা
ধরা যাক, আমাদের ১ থেকে ৫ পর্যন্ত সংখ্যাগুলোর বর্গ (square) বের করে একটি নতুন লিস্ট তৈরি করতে হবে।
squares = [x**2 for x in range(1, 6)]
print(squares)
আউটপুট:
[1, 4, 9, 16, 25]
উদাহরণ ৪: স্ট্রিং লিস্ট থেকে ফিল্টার করা
ধরা যাক, আমাদের একটি লিস্টে কিছু নাম রয়েছে, এবং আমরা শুধুমাত্র "A" দিয়ে শুরু হওয়া নামগুলো সংগ্রহ করতে চাই।
names = ["Alice", "Bob", "Anna", "Charlie"]
a_names = [name for name in names if name.startswith("A")]
print(a_names)
আউটপুট:
['Alice', 'Anna']
উদাহরণ ৫: নেস্টেড লিস্ট কম্প্রিহেনশন
নেস্টেড লুপ ব্যবহার করে টেবিল তৈরি করা যাক। উদাহরণস্বরূপ, ১ থেকে ৩ পর্যন্ত প্রতিটি সংখ্যার জন্য ১ থেকে ৩ পর্যন্ত সংখ্যাগুলোর গুণফল বের করা।
table = [[x * y for y in range(1, 4)] for x in range(1, 4)]
print(table)
আউটপুট:
[[1, 2, 3], [2, 4, 6], [3, 6, 9]]
লিস্ট কম্প্রিহেনশনের সুবিধা:
- সংক্ষিপ্ত এবং সহজ: এটি সাধারণ লুপের চেয়ে কম কোডে একই কাজ করতে পারে।
- পঠনযোগ্যতা: কিছু ক্ষেত্রে এটি কোডকে আরও পড়ার যোগ্য করে তোলে।
- পারফরম্যান্স: লিস্ট কম্প্রিহেনশন সাধারণত নিয়মিত লুপের চেয়ে দ্রুত কাজ করে।
সংক্ষেপে:
লিস্ট কম্প্রিহেনশন পাইথনে একটি সহজ, কার্যকর এবং দ্রুত উপায় লিস্ট তৈরি করার জন্য, যা একটি লুপ এবং ঐচ্ছিক কন্ডিশনের মাধ্যমে ইটারেবল অবজেক্ট থেকে লিস্ট তৈরি করে। এটি কোডকে সংক্ষিপ্ত ও কার্যকর করে তুলতে সাহায্য করে।
পাইথনে লিস্ট, টিউপল, সেট এবং ডিকশনারির উপর বিভিন্ন ধরনের অপারেশন করা যায়। প্রতিটি ডেটা স্ট্রাকচারের নিজস্ব কিছু অপারেশন আছে যা ডেটা ম্যানিপুলেশনের জন্য ব্যবহৃত হয়। নিচে প্রতিটি ডেটা স্ট্রাকচারের উপর সাধারণ কিছু অপারেশন এবং উদাহরণ দেওয়া হলো।
১. লিস্ট (List) অপারেশন
উদাহরণ:
fruits = ["apple", "banana", "cherry"]
অপারেশনসমূহ:
অ্যাড (Add): নতুন আইটেম যোগ করতে append() এবং নির্দিষ্ট স্থানে যোগ করতে insert()।
fruits.append("orange") # ['apple', 'banana', 'cherry', 'orange']
fruits.insert(1, "mango") # ['apple', 'mango', 'banana', 'cherry', 'orange']
রিমুভ (Remove): একটি নির্দিষ্ট আইটেম সরাতে remove() এবং শেষ আইটেম সরাতে pop()।
fruits.remove("banana") # ['apple', 'mango', 'cherry', 'orange']
fruits.pop() # ['apple', 'mango', 'cherry']
কাউন্ট (Count): নির্দিষ্ট আইটেমের সংখ্যা গণনা করতে count()।
fruits.count("apple") # আউটপুট: 1
সোর্ট (Sort): লিস্ট সজ্জিত করতে sort()।
fruits.sort() # ['apple', 'cherry', 'mango']
২. টিউপল (Tuple) অপারেশন
টিউপল অপরিবর্তনযোগ্য হওয়ায় খুব সীমিত অপারেশন রয়েছে।
উদাহরণ:
colors = ("red", "green", "blue", "green")
অপারেশনসমূহ:
ইনডেক্স (Index): একটি নির্দিষ্ট আইটেমের অবস্থান খুঁজতে index()।
colors.index("green") # আউটপুট: 1
কাউন্ট (Count): একটি নির্দিষ্ট আইটেমের সংখ্যা গণনা করতে count()।
colors.count("green") # আউটপুট: 2
৩. সেট (Set) অপারেশন
সেট ডুপ্লিকেট আইটেম অনুমোদন করে না এবং এতে কিছু সাধারণ সেট থিওরি অপারেশন রয়েছে।
উদাহরণ:
numbers = {1, 2, 3}
অপারেশনসমূহ:
অ্যাড (Add): নতুন আইটেম যোগ করতে add()।
numbers.add(4) # {1, 2, 3, 4}
রিমুভ (Remove): নির্দিষ্ট আইটেম সরাতে remove() বা discard()।
numbers.remove(2) # {1, 3, 4}
ইউনিয়ন (Union): দুটি সেটের ইউনিয়ন পেতে union()।
odd = {1, 3, 5}
even = {2, 4, 6}
union_set = odd.union(even) # {1, 2, 3, 4, 5, 6}
ইন্টারসেকশন (Intersection): দুটি সেটের কমন উপাদান পেতে intersection()।
set1 = {1, 2, 3}
set2 = {2, 3, 4}
intersect_set = set1.intersection(set2) # {2, 3}
৪. ডিকশনারি (Dictionary) অপারেশন
ডিকশনারি কী-ভ্যালু পেয়ার নিয়ে কাজ করে, এবং এতে কিছু সাধারণ অপারেশন রয়েছে।
উদাহরণ:
person = {
"name": "Alice",
"age": 25,
"city": "New York"
}
অপারেশনসমূহ:
অ্যাক্সেস (Access): নির্দিষ্ট কী এর মান অ্যাক্সেস করতে [] বা get()।
print(person["name"]) # আউটপুট: Alice
print(person.get("city")) # আউটপুট: New York
অ্যাড/আপডেট (Add/Update): নতুন কী-ভ্যালু পেয়ার যোগ করতে বা আপডেট করতে।
person["job"] = "Engineer" # নতুন কী-ভ্যালু পেয়ার যোগ করা
person["age"] = 26 # বিদ্যমান মান আপডেট করা
রিমুভ (Remove): নির্দিষ্ট কী-ভ্যালু পেয়ার সরাতে pop() এবং সবগুলো সরাতে clear()।
person.pop("city") # {'name': 'Alice', 'age': 26, 'job': 'Engineer'}
person.clear() # {}
কীস এবং ভ্যালুস (Keys and Values): সমস্ত কী এবং ভ্যালু পেতে keys() এবং values()।
print(person.keys()) # dict_keys(['name', 'age', 'job'])
print(person.values()) # dict_values(['Alice', 26, 'Engineer'])
সারসংক্ষেপ
পাইথনে লিস্ট, টিউপল, সেট এবং ডিকশনারির উপর এই অপারেশনগুলো ডেটা ম্যানিপুলেশনের জন্য ব্যবহার করা হয়। এগুলো প্রোগ্রামে দ্রুত এবং কার্যকরভাবে ডেটা নিয়ে কাজ করতে সাহায্য করে।
Read more