> For the complete documentation index, see [llms.txt](https://bangla-python-book.gitbook.io/python-programming-language/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bangla-python-book.gitbook.io/python-programming-language/data-types/collection-data-types/set-types/set-type.md).

# সেট

সেট পাইথনের একটি ইমিটেবল ডেটা টাইপ। ডিকশিনারির মত পাইথনে সেট লিখার জন্য কার্লি ব্রেসিস {} ব্যবহার করা হয়, তবে এখানে ডিকশিনারির মত "কি-ভ্যালু" পেয়ার থাকে না। ডেটা গুলো অবিন্যস্ত অবস্থায় থাকে। আবার set() মেথড দিয়ে ও সেট ক্লাসের অবজেক্ট তৈরি করা যায়৷ সেটের প্রতিটি ভ্যালু ই হয় ইউনিক। মানে তুমি চাইলে একই ডেটা একাধিক বা রাখতে পার কিন্তু পাইথন সেসব বাদ দিয়ে প্রত্যেকটি ডেটা একবার করে রাখবে।

```python
>>> a_set={'a','b','c','d','c'}
>>> type(a_set)
<class 'set'>
>>> a_set
{'c', 'd', 'b', 'a'}
```

এখানে আমি ‘a’ এবং ‘c’ দু’বার করে রাখলে ও পাইথন সেগুলোকে একবার করে সেটে জমা করেছে।

**সেট অপারেশন্স**

আমরা গণিতে সেটের সমাধান করার সময় সেটে নতুন উপাদান যোগ করা বা বাদ দেয়া ছাড়া ও ইউনিয়ন, ইন্টারসেকশন ইত্যাদি অপারেশন চালাতে পারতাম। পাইথন সেট ও এর ভিন্ন নয়।

**আপডেট**

কোন সেটে নতুন কোন মেম্বার যোগ করার জন্য add() মেথড ব্যবহার করা হয়।

```python
>>>a_set = {'a','b','c','d'} 
>>>a_set.add('e'} 
>>>print(a_set)
{'a','b','c','d','e'}
```

তবে add() মেথড ব্যবহার করে আমরা প্রতিবারে একটির বেশি এলিমেন্ট যোগ করতে পারব না। একসাথে একাধিক এলিমেন্ট যোগ করার জন্য update() মেথড ব্যবহার করতে হয়।

```python
>>>a_set = {'a','b','c','d'} 
>>>a_set.update('e','f','g'} 
>>>print(a_set)
{'a','b','c','d','e','f','g'}
```

**ডিলিটং**

সেটের এলিমেন্ট ডিলিট করার জন্য discard(),remove(),pop() এই তিনটি মেথড ব্যবহার করা হয়। pop() মেথড একেক বার একেক এলিমেন্ট কে ডিলিট করে। কারণ সেট অন্যান্য ডেটা টাইপের মত ইন্ডেক্সিং সাপোর্ট করে না।

```python
>>>a_set = {'a','b','c','d'} 
>>>a_set.pop()
>>>print(a_set)
{'a','b','c'}
```

discard() এবং remove() মেথড একই কাজ করে, তবে একটি পার্থক্য হলঃ

discard() মেথড ব্যবহার করে যদি কোন এলিমেন্ট ডিলিট করতে হয় তবে সে এলিমেন্ট যদি সেটে না থাকে তাহলে ও পাইথন কোন এরর মেসেজ দেখাবে না।

কিন্তু remove () মেথডের ক্ষেত্রে যে এলিমেন্ট আমরা ডিলিট করব সেটি সেটে অবশ্যই থাকতে হবে তা না হলে পাইথন এরর দেখাবে৷

```python
>>> a_set = {'a','v','d'}
>>> type(a_set)
<class 'set'>
>>> a_set.remove('a')
>>> a_set
{'d', 'v'}
>>> a_set.discard('a')
>>> a_set.remove('a')
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a_set.remove('a')
KeyError: 'a'
```

**ইন্ডেক্সিং**

সেট অন্যান্য ডেটা টাইপের মত ইন্ডেক্সিং সাপোর্ট করে না। তুমি যদি কোন সেটের এলিমেন্ট কে তার ইন্ডেক্স দিয়ে এক্সেস করতে চান তাহলে এরর দেখাবে।

```python
>>>a_set = {'a','b',1,'c'}
>>>print(a_set[0])
TypeError: 'set' object does not support indexing
```

এ কারনেই আমরা যখন add() বা update() ফাংশন ব্যবহার করি তখন একেক বার একের জায়গায় এলিমেন্ট যোগ হয়।

**ইউনিয়ন**

দু’টো বা তার বেশি সেটের সব উপাদান গুলো যোগ করার পদ্ধতিকে সেট ইউনিয়ন বলে।

```python
>>> a = {'a','b','c'}
>>> b = {'1','2','3'}
>>> a|b
{'3', '2', 'a', 'c', 'b', '1'}
>>> c = {1,2,3}
>>> a|b|c
{1, '3', '2', 2, 3, 'a', 'c', 'b', '1'}
```

এখানে লক্ষ করবে সেট গুলোতে ভিন্ন ধরনের ডেটা থাকা সত্ত্বেও সেট গুলোর মধ্যে ইউনিয়ন অপারেশন চালানো সম্ভব।

**ইন্টারসেকশন**

দুই বা ততোধিক সেটের উপাদান গুলো থেকে সব সেটেই বিদ্যমান এমন উপাদান বের করার পদ্ধতিকে সেট ইন্টারসেকশন বলে।

```python
>>> a&b&c
set()
>>> a = {'a','b','c'}
>>> b = {'b','c','d'}
>>> a&b
{'c', 'b'}
```

**সেট ডিফারেন্স**

একটি সেট থেকে আরেকটি সেট বাদ দেয়াকে সেট ডিফারেন্স বলে।

```python
>>> a-b
{'a'}
```

এছাড়া ও কোন উপাদান সেটে আছে কিনা। কোন সেটে অন্য কোন সেটের সাবসেট কিনা ইত্যাদি অপারেশন পাইথন সেট এ করা যায়।

```python
>>> 'a' in a
True
>>> 's' in a
False
>>> a = {'a','b'}   
>>> b = {'a'}
>>> a > b    #subset
True
>>> a < b
False
```
