আরো কিছু ডেটা টাইপ
আমাদের Python for Unstoppable Learners প্লেলিস্টে এর আগেও পাইথনের বিভিন্ন ডেটাটাইপ নিয়ে আলোচনা করেছি। এমনকি ডেটা স্ট্রাকচারের বেসিক নিয়ে একটি ডেডিকেটেট ভিডিও পর্যন্ত আছে। তবে পাইথনে আরো কিছু ডেটা টাইপ আছে, এই ভিডিওতে/ডকুমেন্টেশনে আমরা মূলত সেই ডেটা টাইপ গুলো নিয়েই আলোচনা করবো।
যা যা শিখবোঃ
- Tuples
- Sets
- Frozen Set
- and their operations.
Tuples (টাপলস)
Tuples হচ্ছে পাইথনের আরো একটি ডেটা টাইপ যেটা আমাদেরকে ডেটা সংরক্ষন ও প্রয়োজন অনুসারে ব্যবহার করতে দেই। এই ডেটা টাইপটিকে আপনি লিস্টের [ List/array] চাচাতো ভাই বলতে পারেন। কারণ এটি প্রায় লিস্টের মতোই একটি ক্রমিক (sequential) ডেটা টাইপ, যেটা দিয়ে আমরা চাইলে একটি ভ্যারিয়েবলের মধ্যে একাধিক ডেটা(ভ্যালু) সংরক্ষন করতে পারি। এই ভ্যালুগুলো হতে পারে পাইথনের যেকোনো ডেটা টাইপ। একাডেমিক সংজ্ঞা দিলে -
A tuple is a collection of elements that are ordered and immutable.
উপরের এই দুটো শব্দকে খেয়াল করুনঃ ordered, immutable
- Ordered: বলতে বোঝায় আমরা চাইলে লিস্টের মতো করে ইন্ডেক্স নাম্বার (Index numbers) দিয়ে একটি টাপলস থেকে ডেটার অ্যাক্সেস নিতে পারবো।
- Immutable: বলতে বোঝায়, একবার কোনো ডেটা টাপলসের মধ্যে সেভ করা হলে আর কখনো আমরা সেই ডেটাটিকে পরিবর্তন (Change) করতে পারবো না। এমনকি আপডেট করাও যাবে না।
সুতরাং লিস্ট এবং তার চাচাতো ভাই টাপলসের মধ্যে থাকা একটি বড় পার্থক্য হলো- লিস্ট হচ্ছে Mutable(পরিবর্তনযোগ্য) আর টাপলস হচ্ছে immutable(অপরিবর্তনীয়)।
Creating Tuple
টাপলস তৈরি করা খুবই সহজ। আমরা ভ্যালু বা এলিমেন্টগুলোকে কমা(,) দ্বারা সেপারেট(Separate) করে সেগুলোকে প্রথম বন্ধনীর মধ্যে রেখে একটি টাপল তৈরি করতে পারি। নিচের উদাহরণে একটি ফাঁকা টাপল তৈরি করে দেখানো হলোঃ
heroTuple = ()
print(heroTuple)
চলুন আরো একটি উদাহরণ দেখে নিই,
heroTuple = ("Programming Hero","Rabbil Hasan","W3 School")
print(heroTuple)
আমরা টাপলসের মধ্যে শুধু সেই ডেটা গুলো রাখবো যেগুলো আর কোনোদিন পরিবর্তন করার প্রয়োজন হবে না। আরো একটি উদাহরণঃ
examMarks = (47,34,87,90,45.5,51)
print(examMarks)
টাপলস অপারেশন (Tuples Operation)
টাপলস কি তা আমরা জানি, পাইথনে কীভাবে টাপলস লিখতে হয় তাও আমরা জানি। এবার চলুন টাপলস দিয়ে আরো কিছু অপারেশন করার চেষ্টা করি।
চলুন একটা টাপলস নিয়ে সেটার কোনো একটি এলিমেন্টের ভ্যালু আপডেট করার চেষ্টা করি।
myTuple = (1,2,3,4,5)
print(myTuple)
myTuple[1]=7
print(myTuple)
আপনি উপরের কোডে দেখতে পাচ্ছেন যে, আমি myTuple
নামে একটি টাপল নিয়েছি। আরপর সেটার ১নম্বর ইন্ডেক্সে থাকা এলিমেন্টটির ভ্যলু আপডেট করার চেষ্টা করেছি। যখন আমি এই কোডটিকে রান করার চেষ্টা করেছি, তখন আমাকে এই এরোর(error) টা দেখাচ্ছে - TypeError: 'tuple' object does not support item assignment
আমি আগেই বলেছিলাম, একবার কোনো ডেটা টাপলসের মধ্যে সেভ করা হলে আর কখনো আমরা সেই ডেটাটিকে পরিবর্তন (Change) করতে পারবো না। কারণ টাপল হলো একটি ইমিউটাবল ডেটা টাইপ।
যেহেতু আমরা আগে থেকে জানি যে, টাপলস হলো ইমিউটাবল(immutable) ডেটা টাইপ। তাই আপডেট এর মতো একটি টাপলের মধ্যে আমরা কখনো ডিলিট (DELETE) অপারেশনও চালাতে পারবো না। কিন্তু অবশ্যই আমরা চাইলে সম্পূর্ণ টাপলটি del
কীওয়ার্ড ব্যবহার করে ডিলিট করতে পারবো। নিচের কোডটি দেখলেই বুঝতা পারবেনঃ
myTuple = (1,2,3,4,5)
del myTuple
এবার একটু নিচের কোডগুলো দেখুন তো -
myTuple = (1,2,3,4,5)
print(myTuple[0])
print(myTuple[2])
উপরে কোডে আমরা এলিমেন্টের ইন্ডেক্স নম্বর ব্যবহার করে তাদের ভ্যালু দেখতে পাচ্ছি। আমরা কিন্তু আগে থেকেই জানি লিস্ট ও টাপলস হলো Ordered ডেটা টাইপ। তাই আমরা টাপলস ও লিস্টে ইন্ডেক্স নম্বর ব্যবহার করে fetch operation চালাতে পারি। উল্লেখ্য আমরা চাইলে নেগেটিভ ইন্ডেক্সিং (negative indexing) ব্যবহার করতে পারি। এমনকি পাইথনে সকল sequential data type এ নেগেটিভ ইন্ডেক্সিং ব্যবহার করা যায়।
যেমনটা আমরা জানি, ইন্ডেক্সিং ০
থেকে শুরু হয়, ইন্ডেক্স নম্বর শূন্য (০)
বলতে বোঝায় এক (১)
নম্বর এলিমেন্ট। ইন্ডেক্স নম্বর ১
বলতে বোঝায় ২
নম্বর এলিমেন্ট। এভাবে চলতা থাকে।
নেগেটিভ ইন্ডেক্সিং শুরু হয় -1
থেকে, ইন্ডেক্স নম্বর -1
বলতে বোঝায় শেষ এলিমেন্ট। ইন্ডেক্স নম্বর -2
বলতে বোঝায় শেষের দিক থেকে দ্বিতীয় এলিমেন্ট।
টাপলস মেথড (Tuples Method)
পাইথন আমাদেরকে টাপলস নিয়ে কাজ করার জন্য বেশ কয়েকটি বিল্ট-ইন মেথড (Built-in Methods) দেয়। যাতে আমাদের কাজে গতি একটু হলেও বাড়ে।
অন্যতম একটি সিম্পল ও কমন মেথড হলো len()
মেথড। এই মেথড দিয়ে আপনি চাইলে একটা টাপলের Length দেখতে পারবেন। নিচের কোডটি দেখলে আপনি পরিষ্কার বুঝতে পারবেন-
friends = ("Bappy","Musa","Trisha","Nurani","Alhaz","Mabia")
print(friends)
length_of_friends = len(friends)
print(length_of_friends)
min()
এবং max()
মেথড গুলো যথাক্রমে একটি টাপলের সবচেয়ে ছোট ও সবচেয়ে বড় এলিমেন্টকে রিটার্ন করে। উদাহরণঃ
nums = (45,67,32,97,53,6,84,85)
print(nums)
print(min(nums))
print(max(nums))
count()
মেথড ব্যবহার করে একটি টাপলের মধ্যে একটি এলিমেন্ট কতবার আছে তা গণনা করা যায়। উদাহরণঃ
nums = (45,67,32,97,53,6,84,85,53)
print(nums)
print(nums.count(53))
টাপলের মধ্যে থাকা একটি এলিমেন্টের ইন্ডেক্স নম্বর বের করার জন্য index()
মেথডটি ব্যবহার করা হয়। উদাহরণঃ
nums = (45,67,32,97,53,6,84,85)
print(nums)
print(nums.index(6))
সেট (Sets)
লিস্ট ও টাপলের আরো একটি চাচাতো ভাই আছে, যার নাম হলো সেট। তবে সেট তার কাজিনদের থেকে একটু আলাদা। সেট হলো এমন একটি ডেটা টাইপ যার মধ্যে আপনি একাধিক ইমমিউটাবল (immutable type) টাইপের ডেটা রাখতে পারবেন। সেটের এলিমেন্ট গুলো ordered
নয়, unordered
. ।যেহেতু সেটের এলিমেন্টগুলো unordered
, সেহেতু তাদের সাথে কোনো ইন্ডেক্স নম্বর থাকে না।
সেট সম্পর্কে নিচের কথা গুলো ভুললে চলবে না ➖
- Set হলো immutable data type এর একটি সংগ্রহ। অর্থাৎ, সেটের মধ্যে মিউটাবল (mutable) ডেটা রাখা যায় না।
- একটি সেটের মধ্যে শুধু ইউনিক(Unique) ভ্যালু রাখতে পারবেন। অর্থাৎ একই ভ্যালু দুইবার-তিনবার রাখা যাবে না।
- সেট একটি মিউটাবল (mutable) ডেটা টাইপ। একবার ডিফাইন(Define) করার পর পরিবর্তন করা যাবে, আপডেট-ডিলিট এগুলো করা যাবে।
লক্ষ্য করুনঃ সেট Mutable হলেও, তার মধ্যে যারা থাকবে তারা কিন্তু Immutable.
Creating Sets
সেট তৈরি করা বেশ সহজ। পাইথনে কারলি ব্রেস(Curly braces {}
) বা দ্বিতীয় বন্ধনীর মধ্যে immutable ভ্যালু গুলোকে কমা দিয়ে আলাদা করে সেট লিখা হয়। নিচে সেটের একটি উদাহরণ দেওয়া হলো-
numbers = {1,2,3,4,0,7,5}
data = {"Kochu Programmer",7.0,500}
print(numbers)
print(data)
ফাঁকা সেট (Empty Set)
আমাদেরকে এমন অবস্থায় পড়া লাগতে পারে যে, একটি ফাঁকা সেট তৈরি করতে হবে। তারপর প্রয়োজন অনুসারে সেটা পূর্ণ করা লাগবে। এখন এই ফাঁকা সেট তৈরি করতে গেলে সবাই কমন একটা ভুল করে। নিচের কোডটি দেখুন তো -
example = {} #এটা কিন্তু ফাঁকা সেট না
কি! দেখে ফাঁকা সেট মনে হচ্ছে না। তবে type()
মেথড ব্যবহার করে example ভ্যারিয়েবলের ডেটা টাইপ দেখতে গেলে আউটপুট দেখাবে example ভ্যারিয়েবলটি একটি ডিকশনারি।
মনে আছে তো, ডিকশনারি (Dictionary) তৈরি করতেও Curly braces {}
ব্যবহার করা লাগে। তাই এখানে ফাঁকা সেট তৈরি না হয়ে, একটি ফাঁকা ডিকশনারি তৈরি হয়েছে।
ফাঁকা সেট তৈরি করার জন্য আমরা set()
ফাংশনটি ব্যবহার করবো। উদাহরণঃ
empty_set = set()
সেটের অংক
পাইথনের এই সেটের সাথে স্কুলে গণিত ক্লাসে শেখা সেটের একটা মিল নিশ্চয়-ই খেয়াল করেছেন, -দুটোই দ্বিতীয় বন্ধনী দিয়ে লিখা হয়। গণিত বইয়ের সেটে যেমন -
- Union (সংযোগ)
- Intersection (ছেদ)
- Difference (অন্তর)
এগুলো আছে, তেমনি পাইথনের সেটেও এগুলো আছে। এখানে আমি ধরেই নিচ্ছি আপনি সেটের বেসিক অংক গুলো পারেন, যদি ভুলে গিয়ে থাকেন তবে অষ্টম কিংবা নবম-দশম শ্রেণির একটি বই জোগার করে জেনে নিন।
Set Union
দুইটা সেটের Union বা সংযোগ সেট বের করার জন্য পাইথনে দুইটা উপায় রয়েছে -
- (pipe)
|
অপারেটর ব্যবহার করে,
union()
মেথড ব্যবহার করে
এবার ধরুন, আমাদের কাছে A ও B নামের দুইটি সেট আছে, তাদের ইউনিয়ন করতে হবে।
Pipe operator ব্যবহার করে -
A = {1,2,3}
B = {4,5,6}
print(A | B)
union()
মেথড ব্যবহার করে
A = {1,2,3}
B = {4,5,6}
print(A.union(B))
Set Intersection:
দুইটা সেটের Intersection বা ছেদ সেট বের করার জন্য পাইথনে দুইটা উপায় রয়েছে -
&
অপারেটর ব্যবহার করে,
intersection()
মেথড ব্যবহার করে
এখন ধরুন, আমাদের কাছে A ও B নামের দুইটি সেট আছে, তাদের Intersection করতে হবে।
&
অপারেটর ব্যবহার করে-
A = {1,2,3,4,5}
B = {4,5,6,7,8}
print(A & B)
intersection()
মেথড ব্যবহার করে-
A = {1,2,3,4,5}
B = {4,5,6,7,8}
print(A.intersection(B))
Set Difference
দুইটা সেটের Difference বা অন্তর বের করার জন্য পাইথনে দুইটা উপায় রয়েছেঃ
-
অপারেটর ব্যবহার করে-
A = {1,2,3,4,5}
B = {4,5,6,7,8}
print(A - B)
difference()
মেথড ব্যবহার করে-
A = {1,2,3,4,5}
B = {4,5,6,7,8}
print(A.difference(B))
Set Operation
List/Dictionary-এর মতো করে Set-কে অ্যাক্সেস বা ম্যানিপুলেট করা যায় না কেন?
👉 কারণ set
unordered — অর্থাৎ এর মধ্যে আইটেমগুলোর কোনো index থাকে না।
তাই তুমি set[0]
বা set[1]
টাইপে ইনডেক্স দিয়ে কোনো আইটেম পাবে না, যেমন list বা tuple-এ পেতে।
my_set = {10, 20, 30}
print(my_set[0]) # ❌ Error: 'set' object is not subscriptable
⚠️ এছাড়া set
এর মধ্যে key-value pair থাকে না — তাই dictionary-এর মতো .keys()
বা .values()
কাজ করে না।
🔁 Set থেকে আইটেম ফেচ করার ট্রিক:
যেহেতু index নেই, তাই যদি নির্দিষ্ট এলিমেন্ট দেখতে হয় — একমাত্র রাস্তা হলো for loop
!
my_set = {"apple", "banana", "cherry"}
for fruit in my_set:
if "apple" in my_set:
print(my_set)
break
else:
print("apple not found in the set.")
🔧 কিছু দরকারি Built-in Methods
✅ add()
– নতুন একটা আইটেম যোগ করতে
fruits = {"apple", "banana"}
fruits.add("cherry")
print(fruits) # Output: {'apple', 'banana', 'cherry'}
🔁 update()
– একাধিক আইটেম একসাথে যোগ করতে
numbers = {1, 2, 3}
numbers.update([4, 5, 6])
print(numbers) # Output: {1, 2, 3, 4, 5, 6}
❌ remove()
– কোনো আইটেম মুছে ফেলতে (আইটেম না থাকলে Error দিবে)
items = {"pen", "pencil", "eraser"}
items.remove("pen")
print(items) # Output: {'pencil', 'eraser'}
items.remove("marker") # ❌ KeyError
❓ discard()
– কোনো আইটেম মুছবে, কিন্তু না থাকলেও কোন Error দিবে না
items = {"pen", "pencil", "eraser"}
items.discard("pencil")
items.discard("marker") # ✅ No error
📏 len()
– কতগুলো আইটেম আছে সেটা জানার জন্য
items = {10, 20, 30, 40}
print(len(items)) # Output: 4
⚡ Summary
কাজ | মেথড | কাজ কী করে |
নতুন আইটেম যোগ | add() | একটি আইটেম যোগ করে |
একাধিক আইটেম যোগ | update() | লিস্ট/সেট দিয়ে অনেক আইটেম যোগ করে |
আইটেম মুছে ফেলা | remove() | নির্দিষ্ট আইটেম সরায়, না থাকলে Error |
নিরাপদে মুছা | discard() | নির্দিষ্ট আইটেম সরায়, না থাকলে কিছু হয় না |
আইটেম গোনা | len() | কতগুলো আইটেম আছে দেখায় |
সব দেখানো | for loop | সব এলিমেন্ট একে একে ঘুরিয়ে আনে |
Frozen Set
Frozen Set হলো Python-এর একটি immutable অর্থাৎ অপরিবর্তনযোগ্য সেট।
এটি set
এর মতোই ইউনিক এবং unordered এলিমেন্ট রাখে, তবে একবার তৈরি হলে এতে নতুন আইটেম যোগ করা বা কোনো আইটেম মুছে ফেলা যায় না।
👉 সহজভাবে বললে,
Frozen Set = এমন Set যেটা একবার বানালে আর বদলানো যাবে না।
Python-এ frozenset()
ফাংশনের মাধ্যমে Frozen Set তৈরি করা হয়।
🛠️ কিভাবে Frozen Set তৈরি করতে হয়?
Python-এ Frozen Set তৈরি করতে হয় frozenset()
নামের বিল্ট-ইন ফাংশনের মাধ্যমে।
📌 সিনট্যাক্স:
frozenset(iterable)
🔹 এখানে iterable
বলতে বোঝায় এমন যেকোনো কিছু যেটার উপর লুপ চালানো যায় — যেমন list, tuple, set, string ইত্যাদি।
✅ উদাহরণ:
১. List থেকে Frozen Set:
numbers = [1, 2, 3, 4]
f_set = frozenset(numbers)
print(f_set) # Output: frozenset({1, 2, 3, 4})
২. String থেকে Frozen Set:
chars = "hello"
f_set = frozenset(chars)
print(f_set) # Output: frozenset({'h', 'e', 'l', 'o'})
৩. Set থেকে Frozen Set:
normal_set = {10, 20, 30}
frozen = frozenset(normal_set)
print(frozen) # Output: frozenset({10, 20, 30})
⚠️ মনে রাখবে:
- একবার
frozenset
তৈরি করলে, তুমি আর.add()
,.remove()
এসব দিয়ে কিছু বদলাতে পারবে না।
- তবে তুমি এর উপর
for loop
,in
অপারেটর, এবং set-এর অন্যান্য non-modifying অপারেশন চালাতে পারো।
- Union, Intersection এগুলো চালাতে পারবে।