সেট

গণিত এর সেট কে অনুসরণ করে পাইথন ল্যাংগুয়েজ এর সেট ডাটা স্ট্রাকচার গঠন করা হয়েছে। এটি কোন ইনডেক্স এবং অর্ডার বা ক্রম অনুসরণ করে না।
 
পাইথনে লিস্ট এবং টাপল এর মতই আরেকটি ডাটা স্ট্রাকচার হচ্ছে সেট(set). পার্থক্য শুধু আপনি চাইলে টাপল এবং লিস্ট এর মধ্যে ডুপ্লিকেট ভ্যালু রাখতে পারবেন কিন্তু সেট এ কোনো ডুপ্লিকেট ভ্যালু রাখতে পারবেন না। আর টাপল এবং লিস্ট এর ভ্যালু গুলো index আকারে সাজানো থাকে কিন্তু সেট এর ভ্যালু গুলো indexing আকারে থাকেনা বা indexing করা যায় না। সেটি অবশ্য প্রয়োজন পরে না , কারণ সেট এর প্রত্যেকটি ভ্যালু ই ইউনিক।
 
মূলতঃ গাণিতিক কাজ যেমন union, intersection এবং symmetric difference ইত্যাদি বের করার জন্য Set ব্যবহৃত হয়।
 
সেট তৈরি করা
 
সমস্ত আইটেম (উপাদান)কে curly braces {} -এর ভিতরে রেখে [ আইটেমগুলোকে কমা দ্বারা আলাদা করে] একটি সেট তৈরি করা হয়,অথবা বিল্ট-ইন set() ফাংশন ব্যবহার করেও সেট তৈরি করা যায় ।
 
এতে যে কোনো সংখ্যক আইটেম থাকতে পারে এবং সেগুলি বিভিন্ন ধরনের ডাটা টাইপের হতে পারে (ইন্টিজার , স্ট্রিং , ফ্লোট , বুলিয়ান , টাপল )।  কিন্তু একটি সেটের আইটেম হিসাবে কিন্তু পরিবর্তনযোগ্য ( mutable ) ডাটা টাইপ যেমন – সেট , লিস্ট কিংবা ডিকশনারি নিতে পারবো না
 
curly braces {} দিয়ে সেট তৈরী করা
 
# শুধু ইন্টিজার দিয়ে সেট তৈরী করা 
a_set = {10, 20, 30}
print(a_set)

# বিভিন্ন রকম ডাটাটাইপ দিয়ে সেট তৈরী করা 
a_set = {3.1416, "vivasoft", (10,29,40)}
print(a_set)

"""
{10, 20, 30}
{'vivasoft', (10, 29, 40), 3.1416}
"""

কিন্তু যদি লিস্ট দিয়ে যদি সেট তৈরী করতে যাই , এরর পাবো

 

a_set = {10,20,['a','b']}

"""
Output
Traceback (most recent call last):
  File "/home/vivasoft/Desktop/sets/main.py", line 1, in <module>
    a_set = {10,20,['a','b']}
TypeError: unhashable type: 'list'
"""

বিল্ট-ইন set() ফাংশন দিয়ে সেট তৈরী করা

এই ফাংশনটি আসলে আমরা ব্যবহার করি লিস্ট থেকে সেট এ রূপান্তর করার জন্য , set() ফাংশনটি আর্গুমেন্ট হিসেবে একটিই লিস্ট নিবে , এবং লিস্টের প্রতিটি আইটেম কে সেট-এর আইটেম হিসেবে তৈরী করে

a_set = set([1,2,3])

# Output - {1, 2, 3}

ফাঁকা / খালি / empty সেট  তৈরী করা আসলে একটু কনফিউজিং হয়ে দাঁড়ায় মাঝে মাঝে। আমরা {} দিয়ে ফাঁকা সেট তৈরী করতে পারবো না। কারণ {} দিয়ে আমরা ডিকশনারি তৈরী করি. তাহলে ফাঁকা সেট তৈরী করার জন্য , আমরা set() ফাংশনটি ব্যবহার করতে পারি

a_set = set()
print(type(a_set))

a_set = {}
print(type(a_set))

"""
Output
<class 'set'>
<class 'dict'>

"""

 

সেটের আইটেম অ্যাক্সেস

যেহেতু সেটে কোন তথ্য orderly সাজানো থাকে না বা কোন ইনডেক্স থাকেনা তাই একটি নির্দিষ্ট উপাদানকে index অনুসারে অ্যাক্সেস করা যায়না।
 
my_set = {"pen", "laptop", "cellphone"} 
print(my_set) 

# output
## {"pen", "laptop", "cellphone"} 

print(my_set[0]) 

#output
##  (most recent call last): 
## File "<stdin>", line 1, in <module> 
## TypeError: 'set' object does not support indexing
 
 
এখানে প্রোগ্রাম এর আউটপুট আমরা TypeError পাচ্ছি । আসলে, সেটের উপাদানগুলোকে ইনডেক্স নম্বর দিয়ে অ্যাক্সেস করা যায় না। তবে আমরা in অপারেটরের মাধ্যমে কোন উপাদান কোন সেটে আছে কিনা সেটা যাচাই করতে পারি। ফলাফল হিসেবে True অথবা False পাওয়া যায়।
 
my_set = {"pen", "laptop", "cellphone"} 
"pen" in my_set 
# True 

"cat" in my_set 
# False

তবে আমাদের লুপের মাধ্যমে সেটের প্রতিটি উপাদানকে অ্যাক্সেস করতে হবে

 
my_set = {"pen", "laptop", "cellphone"} 
for value in my_set: 
    print(value) 


# output 
# pen 
# laptop 
# cellphone

সেট মেথডস (Set Methods)

অন্যান্য ডাটাটাইপের মত সেটের জন্যও ফিক্সড কিছু method আছে। নিচে এগুলো আলোচনা করা হল ।
 
 
সেটে নতুন উপাদান যুক্ত করা
সেটে নতুন একটি উপাদান যোগ করার জন্য এই add() মেথডটি ব্যবহার করা হয়।
 
my_set = {"pen", "laptop", "cellphone"} 
print(my_set) 

## {'laptop', 'pen', 'cellphone'} 

my_set.add('cat') 
print(my_set) 

## {'laptop', 'pen', 'cellphone', 'cat'}

 

একসাথে অনেক গুলো উপাদান যোগ করার ক্ষেত্রে add() ফাংশন কাজ করে না। তখন আমাদের update() ফাংশন ব্যবহার করতে হবে। এই ফাংশনের ভিতর অনেকগুলো ভ্যালু দিলেই তা অ্যাড হয়ে যাবে।

 

 
my_set = {"pen", "laptop", "cellphone"} 
print(my_set) 
## {'laptop', 'pen', 'cellphone'} 

my_set.update("dog", "egg") 
print(my_set) 
# {'laptop', 'pen', 'cellphone', 'e', 'd', 'g', 'o', 'cat'}
 
আমরা একবার নরমালি দুইটা এলিমেন্ট পাস করেছিলাম। কিন্তু তখন জিনিসগুলা ক্যারেক্টার হিসাবে ভাগ হয়ে সেটে অ্যাড হয়েছে। আমরা যেভাবে দিয়েছি সেভাবে অ্যাড করার জন্য এলিমেন্টগুলোকে {} চিহ্নের ভিতরে পাঠাতে হবে।
 
 
my_set = {"pen", "laptop", "cellphone"} 
print(my_set) 
## {'laptop', 'pen', 'cellphone'} 

my_set.update({"dog", "egg"}) 
print(my_set) 
## {'laptop', 'dog', 'pen', 'egg', 'cellphone'}
 
discard() and remove() ফাংশন
 
এই discard () মেথডটি সেটে বিদ্যমান কোন উপাদান মুছে ফেলে।
 
 
my_set = {"pen", "laptop", "cellphone"} 
print(my_set) 
## {'laptop', 'pen', 'cellphone'} 

my_set.discard("pen") 
print(my_set) 
## {'laptop', 'cellphone'}

 

remove() মেথডটি সেটে বিদ্যমান কোন একটি উপাদানকে মুছে ফেলার জন্য ব্যবহার করা হয়। এটি discard() এর মতই, তবে যদি কোন উপাদান সেটে না থাকে, সেই উপদানকে discard() করতে গেলে কোন এরর দেয়না কিন্তু remove() মেথড দেয়।

 

 
my_set = {"pen", "laptop", "cellphone"} 
print(my_set) 
## {'laptop', 'pen', 'cellphone'} my_set.remove('pen') 

print(my_set) ## {'laptop', 'cellphone'} 
my_set.remove('pen') 

## Traceback (most recent call last): 
## File "<stdin>", line 1, in <module> 
## KeyError: 'pen'

যদি আমরা আমাদের সেটের সব এলিমেন্টকে একটা স্টেটমেন্ট দিয়েই মুছে ফেলতে চাই, তখন আমরা clear() মেথডটি ব্যবহার করব।

my_set = {"pen", "laptop", "cellphone"}
print(my_set) 
## {'laptop', 'pen', 'cellphone'} 

my_set.clear()
print(my_set) 
## set()

 

সেট Length
একটা সেটে ঠিক কতগুলো আইটেম রয়েছে তা জানার জন্য আমরা len() ফাংশনটা ব্যবহার করতে পারি। একটা উদাহরণ দেখা যাক:
 
A = {1, 2, 3, 4, 5} 
B = len(A) 

## 5

 

ইউনিয়ন
দুইটি সেটের union করার অর্থ এমন যে, একটা নতুন সেট গঠন করা হবে সেখানে  দুইটি সেটের  সকল উপাদান থাকবে।
ধরা যাক,
 X = {1, 2, 3, 4, 5}
Y = {6, 7, 8}
X এবং Y দুইটা সেট হলে, তাদের ইউনিয়ন সেট C = (X U Y) = {1, 2, 3, 4, 5, 6, 7, 8}
 
এই একই কাজ union() ফাংশন  ব্যবহার করে পাইথন এ করা যায় । উদাহরণ:
 
 
X = {1, 2, 3, 4, 5} 
Y = {6, 7, 8} 
X.union(Y) 

## {1, 2, 3, 4, 5, 6, 7, 8}

 

X আর Y দুইটা সেট। প্রোগ্রাম টি তে শেষ লাইনের মাধ্যমে আমরা পরিবর্তিত সেট তৈরী করেছি, যেটি এই দুটি সেটের ইউনিয়ন
 
 
ইন্টারসেকশন
দুইটি সেটের intersection করার অর্থ এমন যে, একটা নতুন সেট গঠন করা হবে সেখানে শুধুমাত্র দুইটি সেটের কমন উপাদানগুলো থাকবে।
ধরা যাক,
 
 
A = {1, 2, 3, 4, 5}
B = {2, 3, 4, 5, 6, 7}
## A এবং B দুইটা সেট হলে, তাদের ইন্টারসেকশন সেট

C = {2, 3, 4, 5}
 
এই একই কাজ intersection() ফাংশন  ব্যবহার করে পাইথন এ করা যায় । উদাহরণ:
 
X = {1, 2, 3, 4, 5}
Y = {6, 7, 8}
X.intersection(B)


## {2, 3, 4, 5}

X আর Y দুইটা সেট। প্রোগ্রাম টি তে শেষ লাইনের মাধ্যমে আমরা পরিবর্তিত সেট তৈরী করেছি, যেটি এই দুটি সেটের ইন্টারসেকশন

 

ডিফারেন্স
ধরি, X ও Y দুইটা সেট আছে।এখন আমরা X – Y বের করব। নতুন যে সেটটা তৈরি হবে সেখানে Y সেটের কোন উপাদান । আবার B – A এর ক্ষেত্রে A সেটের কোন উপাদান থাকতে পারবে না।
 
X = {1, 2, 3, 4, 5, 6}
Y = {5, 6, 7, 8}
## X এবং Y দুইটা সেট হলে, তাদের ইউনিয়ন সেট
C = (X - Y) = {1, 2, 3, 4}

C = (Y - X) = {7, 8}
 
পাইথন দিয়ে X – Y বের করার জন্য difference() ফাংশন ব্যবহার করতে হবে:
 
 
X = {1, 2, 3, 4, 5, 6} 
Y = {5, 6, 7, 8} 
X.intersection(Y) 

## {2, 3, 4, 5}

Y.difference(X) 

## {7, 8}

 

উদাহরন

উদাহরন ১ :

# Empty set create
my_set = set()


# adding item into set
my_set.add(10)


# adding a list into the set
my_set.update([10,20,30,5,25])


# Removing an item from the set
my_set.discard(25)


print(my_set)

উদাহরন ২ :

list = [ "Dhaka", "Khulna", "Satkhira", "Bagerhat" ]

print(list) # prints all elements
print(list[0]) # print first element

list2 = [1,3,4,6,4,7,8,2,3]

print(sum(list2))
print(min(list2))
print(max(list2))
print(list2[0])
print(list2[-1])

## Output:
## ['Dhaka','Khulna','Satkhira','Bagerhat']
## Dhaka
## 38
## 1
## 8
## 1
## 3

উদাহরন ৩:

list = [1,2,3,4,5,6,7] 

print(list[0])  

print(list[1])  

print(list[2])  

print(list[3])  

# Slicing the elements  

print(list[0:6])  

# By default the index value is 0 so it starts from the 0th element and goes for index -1.  

print(list[:])  

print(list[2:5])  

print(list[1:6:2])  

## Output:

## 1

## 2

## 3

## 4

## [1,2,3,4,5,6]

## [1,2,3,4,5,6,7]

## [3,4,5]

## [2,4,6]

উদাহরন ৪:

#List slicing in Python 
my_list = ['r','i','f','a','t','a','k','a','s','h'] 
#elements from index 2 to index 4 
print(my_list[2:5]) 
#elements from index 5 to end 
print(my_list[5:]) 
#elements beginning to end 
print(my_list[:]) 
## Output 
## ['f','a','t'] 
## ['a','k','a','s','h'] 
## ['r','i','f','a','t','a','k','a','s','h']

উদাহরন ৫ :

my_list = ['p', 'r', 'o', 'b', 'l', 'e', 'm'] 
# Output: True 
print('p' in my_list) 
# Output: False 
print('a' in my_list) 
# Output: True 
print('c' not in my_list)


## Output:
## True
## False
## true

 

এসো নিজে করি
* {10,20,30,45} , {30,45,50,60} এই দুইটি সেট থেকে শুধুমাত্র ইউনিক সংখ্যা প্রিন্ট করুন
* {10,20,30} এই সেট এ কি ১০ ভ্যালুটি কোনভাবে ১০০ করা যাবে ?

* User এর  কাছ থেকে 10 টি ইনপুট নিয়ে একটি তালিকা তৈরি করুন। এখন তালিকার সমস্ত পুনরাবৃত্তি উপাদান মুছে ফেলুন

INPUT : [1,2,3,2,1,3,12,12,32]

OUTPUT : [1,2,3,12,32]

* set([10,20],10) এই কোড টি প্রিন্ট করলে আউটপুট কি দেখাবে 

* {10,2,3} এই সেট এ [1,2,3] এই লিস্টের উপাদান গুলো যোগ করুন;  সেটটি প্রিন্ট করুন এবং আউটপুট কি হবে 

 

ইন্টারভিউ প্রশ্নোত্তর
গুরুত্বপূর্ন প্রশ্নসমুহ
* list এবং set এর মধ্যে পার্থক্য কি ?
* discard() এবং remove() এই দুটি ফাংশনের কাজ কি এবং পার্থক্য কি ?
* সেট মিউটেবল ডাটা-টাইপ কেনো 
* সেট এ ডাটা এড করার জন্য কোন ফাংশনটি ব্যবহার করা হয় ?
* ফাঁকা সেট কিভাবে তৈরী করবো