# ডিকশনারি

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

```python
dictA = { 
"key1" : "value1",
"key2" : "value2",
"key3" : "value2",
}
```

আমরা চাইলে ডিকশনারিতে বিভিন্ন টাইপের ভ্যালু রাখতে পারি কিন্তু 'কি' গুলো অবশ্যই ইমিউটেবল ডেটা টাইপের হতে হবে। যেমনঃ স্ট্রিং,নাম্বার,টুপ্যল।

**এক্সেসিং ভ্যালু**

লিস্ট এবং ট্যুপলে ডেটা এক্সেস করার জন্য ইন্ডেক্সিং এর ব্যবহার করছি। কিন্ত ডিকশনারির ডেটা এক্সেস করার জন্য আমরা এর 'কি' গুলো ব্যবহার করি।

```python
>>>dic = {"First" : "Red", 
           "Second" : "Yellow",
           "Third" : "Green" 
}
>>>print(dic[‘Second’]) 
"Yellow"
>>> dic.values()
dict_values(['Red', 'Yellow', 'Green'])
```

আবার যদি এমন কোন 'কি' কল করা হয় যে নামে কোন 'কি' ডিকশনারিতে নেই তখন KeyError এক্সেপশন রেইজ করবে। আমরা ডিকশনারির ভ্যালু থেকে ও এর key বের করতে পারব।

```python
dic ={"a":1, "b":2, "c":3} 

keys = list(dic.keys()) 
values = list(dic.values()) 

print(keys [values.index(1)]) 
print(keys [values.index(3)])
```

আউটপুটঃ a c প্রথমে ডিকশনারির কী ও ভ্যালু গুলোকে লিস্ট অবজেক্টে রূপান্তর করে নিয়েছি। তারপর লিস্টের index() অ্যাট্রিবিউট ব্যবহার করে values লিস্টের এলিমেন্টের ইন্ডেক্স বের করেছি ও এ ভ্যালুকে keys লিস্টে ইনডেক্স হিসেবে পাস করেছি।

এই কাজটা অন্যভাবে ও করা যায়ঃ

```python
def get_key(val): 
    for key, value in dic.items(): 
         if val == value: 
             return key 
    return "key doesn't exist"

dic ={"a":1, "b":2, "c":3} 

print(get_key(1)) 
print(get_key(2))
```

আউটপুটঃ a b

আমাদের যে ভ্যালুর key দরকার সে ভ্যালুটা আমরা get\_key() ফাংশন আর্গুমেন্ট হিসেবে পাস করেছি।get\_key() ফাংশন লিস্টের আইটেম গুলোর মধ্যে সেই ভ্যালু সার্চ করে, খেয়াল করে দেখ এখানে key এবং value দুটোই ইটারেটর তাই প্রতিবার লুপেই key-value জোড় সেটাই হবে যেটা ডিকশনারিতে আছে। value আর্গুমেন্টের সাথে মিলে গেলে get\_key() সেই key-value জোড়ের key টি রিটার্ন করে দিbe আর না মিললে “key doesn’t exist” রিটার্ন করে দিবে।

**আপডেট**

ডিকশনারি একটি মিউটেবল ডেটা টাইপ,আমরা চাইলে যেকোন সময় ডিকশনারি আপডেট করতে পারি৷ নিচের নিয়মে ডিকশনারি তে নতুন এন্ট্রি বা পুরোনো এন্ট্রি আপডেট করতে হয়...

```python
>>>dictionary = { 'Name' : 'Nadim', 'Roll' : '67', 'Dept' : 'CSE' }
>>>dictionary[ 'Name' ] = 'Chowdhury' #Updating existing entry
>>>dictionary[ 'Sec' ] = 'A' #Adding new entry
```

অথবা ডিকশনারির update() অ্যাট্রিবিউট ও ব্যবহার করা যায়।

```python
car = {“brand”:”ford”,
           “model”:”mustang”,
           “year”:1995
           }
car.update({“color”:”red”})
```

**ডিলিট**

ডিকশনারি তে সিঙ্গেল এলিমেন্ট, সব এলিমেন্ট বা পুরো ডিকশনারি ই ডিলিট করে দেয়া যায়। পুরো ডিকশনারি ডিলিট করতে del স্টেটমেন্ট ব্যবহার করা হয়৷

```python
>>>dictionary = {'Name' : 'Nadim', 'Roll' : '67', 'Dept' : 'CSE' }
>>>del dictionary['Dept'] #removing single element 
>>>dictionary.clear() #removing all the elements 
>>>del dictionary[ ] #removing the total dictionary
```

**নেস্টেড ডিকশনারি**

যদি একটি ডিকশনারি ভিতরে আরো ডিকশনারি থাকে তাহলে আমরা কিভাবে সে ডিকশনারি থেকে ভ্যালু বের করে আনব? ধরি আমাদের নিম্নের মত একটি ডিকশনারি আছে...

```python
dictionary = {"Class_One"  : {'roll_1':'Rabib','roll_2':'Rujhan','roll_3':'Ahabab'},
                      "Class_Two"  : {'roll_1':'Yash','roll_2':'Shabab','roll_3':'Sadman'},
                      "Class_Three": {'roll_1':'Awan','roll_2':'Arabi','roll_3':'Jaha'},
              }
```

আমরা যদি ক্লাস ওয়ানের রোল এক এর নাম জানতে চাই তাহলে কিভাবে জানতে পারবে? হয়তো ক্লাস ওয়ান কে আলাদা করে তারপর আবার তার “কি” দিয়ে এক্সেস করতে পারবে। কিন্তু আমরা একই লাইনের মাধ্যমেই ডেটা এক্সেস করতে পারবে।

```python
>>> dictionary["Class_One"]['roll_1']
Rabib
```

এখানে প্রথম “কি” টা\["Class\_One"] মেইন ডিকশনারির “কি”। এই “কি” এর ভ্যালু হিসেবে যে ডিকশনারি টি রিটার্ন হবে সে ডিকশনারি “কি” হচ্ছে এর পরের “কি” \['roll\_1'] এবং এই স্টেট মেন্ট টি এর ডেটা ই রিটার্ন করবে।

```python
>>>world = {'Europe': {"France": {'Capital': "Paris"},
                                      "Germany": {'Capital': "Berlin"},
                                      "Spain": {'Capital': "Madrid"}},
                      'Asia': {"Japan": {'Capital': "Tokyo"},
                                 "Bangladesh":{'Capital': "Dhaka"},
                                 "India":{'Capital': "New Delhi"}}
              }

>>>world['Asia']["Bangladesh"]['Capital']
Dhaka
```

এভাবে যত ইচ্ছা নেস্টেড ডিকশনারি এক্সেস করা যায়। জেসন JSON টাইপের ডেটা ও একই ভাবে এক্সেস করা হয়।
