ডিকশনারি

আমরা লিস্ট, টাপল এবং সেট এই তিনটি স্মার্ট ডাটা টাইপ সম্পর্কে জেনেছি। কিন্তু স্মার্ট এর দিক দিয়ে বিবেচনা করলে ডিকশনারি হবে পাইথনের সবচেয়ে স্মার্ট ডাটা টাইপ। এটির প্রত্যেকটি ভ্যালু পরিবর্তনযোগ্য। সহজ ভাষায় বলা যায় যে ডিকশনারিতে লিস্ট এর মত অনেক গুলো ডাটা জমা করে রাখা যায় এবং যে কোন সময় তার ভ্যালু পরিবর্তন করে অন্য ভ্যালু দেওয়া যায়।
 
যাক একটু থিওরি দেখা হলো এখন আমরা প্রাকটিক্যাল দেখি ডিকশনারি কি এবং কিভাবে তার ব্যবহার করা হয় পাইথন এ —
 
আমরা আগেই বলেছি ডিকশনারি অনেকটা লিস্ট এর মত কিন্তু লিস্টের সাথে এর অমিল অনেক।ডিকশনারি প্রকাশ করতে ব্যবহার হয় {} চিহ্ন। ডিকশনারি লিস্টের মত ইনডেক্সড না, ডিকশনারি তে ভ্যালু ম্যাপ করা হয় key দিয়ে। Key হিসেবে স্ট্রিং, ইন্টিজার, টাপল এর মত পরিচিত ডাটা টাইপস গুলো ব্যবহার করা যায়। লিস্ট এর ইনডেক্স যে কাজ করে, ডিকশনারির ‘key’ একই কাজ করে থাকে। লিস্ট এর মত ভ্যালু হিসেবে যে কোন ডাটা-টাইপ রাখা যায়। এতে কোন বাঁধা নেই।
 
একটি ডিকশনারির key গুলো আলাদা আলাদা হতে হয়, একটার সাথে অপরটা মিলতে পারে না কারণ, ইনডেক্স যেমন ইউনিক ডিকশনারির ক্ষেত্রে key ও তেমন ইউনিক। তবে key এর সাথে ম্যাপ করা value একই হতে পারে।
 
this_dict = {} 
print(this_dict) 
## {} 

print(type(this_dict)) 
## <class 'dict'> 

this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict)
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(type(this_dict)) 
## <class 'dict'>

 

নিচের মত করেও ডিকশনারি কে নির্দেশ করা যায়-
 
a = dict()  
print(a) 
## {} 

print(type(a)) 
## <class 'dict'>

 

অ্যাক্সেস আইটেম
লিস্টের মত করেই ডিকশনারির আইটেম অ্যাক্সেস করা যায়। পার্থক্য হল, লিস্টের ক্ষেত্রে তৃতীয় বন্ধনী এর ভিতর ইনডেক্স নম্বর ব্যবহার করতে হয় আর ডিকশনারির ক্ষেত্রে key ব্যবহার করতে হবে। একটা উদাহরণ দেখা যাক-
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(type(this_dict)) 
## <class 'dict'> 

print(this_dict['name']) 
## 'Masum Rana' 

print(this_dict['nickname']) 
## 'masum' 

print(this_dict['age']) 
## '24'
রিমুভ আইটেম, ডিকশনারি
ডিকশনারি থেকে একটা আইটেমকে রিমুভ করার জন্য আমরা del স্টেটমেন্টকে ব্যবহার করতে পারি। this_dict এই ডিকশনারিতে তিনটি Key ( ‘name’ , ‘nickname’ , ‘age’ ) দিয়ে একে ইনিশিয়ালাইজ করলাম। এখন আমরা যদি ‘age’ এই key কে ডিকশনারি থেকে সরিয়ে দিতে চাই অর্থাৎ ডিলেট করে দিতে চাই , তাহলে সিনট্যাক্স হবে – del this_dict[‘age’] . সুতরাং, del কিওয়ার্ড এর পর লিখতে হবে ডিকশনারির_নাম[ ‘কি-এর নাম’ ]
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
# {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

del this_dict['age'] 
print(this_dict) 
# {'name': 'Masum Rana', 'nickname': 'masum'}
যদি একটা ডিকশনারিকে ফাঁকা করে দিতে চাই তবে clear() ফাংশনটা ব্যবহার করতে পারি।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

this_dict.clear() 
print(this_dict) 
## {}

 

আর যদি সম্পূর্ণ ডিকশনারি রিমুভ করতে চাই? তাহলে? তাহলেও সেই del স্টেটমেন্টের ব্যবহার করতে পারি।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

del this_dict print(this_dict) 
## Traceback (most recent call last): 
## File "<stdin>", line 1, in <module> 
## NameError: name 'this_dict' is not define
 
নেস্টেড ডিকশনারি
আমরা আগেই বলেছি ডিকশনারিতে key হিসাবে যে কোন ডাটাটাইপ ব্যবহার করা যায়। ডিকশনারি তো একধরনের ডাটাটাইপ সেই জন্য আমরা key হিসাবে আমরা ডিকশনারি ব্যবহার করতে পারি । আর এই ডিকশনারি তে key হিসাবে ডিকশনারি ডাটাটাইপ ব্যবহার করাকে নেস্টেড ডিকশনারি বলে । চলেন একটা উদাহরণ দেখা যাক –
person1 = {'name': 'masum','age': 24} 
person2 = {'name': 'mim','age': 25} 
person3 = {'name': 'nahid','age': 24} 
person_dict = { 'person1': person1, 'person2': person2, 'person3': person3 }
print(person_dict)

## 'person1': { 'name': 'masum',  'age': 24}, 
## 'person2': { 'name': 'mim',  'age': 25  }, 
## 'person3': { 'name': 'nahid', 'age': 24  }  }

 

কিছু ফাংশনের (মেথড) প্রয়োগ
 
len()
এই ফাংশনটা কোন ডিকশনারির মোট কয় টা আইটেম আছে তা রির্টান করে ।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(len(this_dict)) 
# 3

 

copy()
আমরা সাধারণত dict1 = dict2 ব্যাবহার করে ডিকশনারি কপি করতে পারি না, সেই জন্য পাইথন আমাদের সুবিধার জন্য copy() ফাংশন তৈরি করে দিয়েছে তা ব্যবহার করে আমরা খুব সহজে ডিকশনারি কপি করতে পারি ।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(this_dict.copy())
## 'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'}
 
 
তবে আমরা dict() ফাংশন ব্যাবহার করে ডিকশনারি কপি করতে পারি।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(dict(this_dict)) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'}

 

get(key, default=None)
এই ফাংশনটা মূলত স্ট্রিংয়ে কোন key সার্চ করে সেটার value পাবার জন্য ব্যবহার করা হয়। যদি key ডিকশনারিতে না থাকে তবে একটা ডিফল্ট ভ্যালু রিটার্ন করবে। ভ্যালুটা হল None, তবে আমরা চাইলে এটাকে পরিবর্তন করে দিতে পারি।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(this_dict.get('name')) 
## 'Masum Rana' 

this_dict.get('home') 
print(this_dict.get('home',' kicu nei'))

## kicu nei
 
this_dict.get(‘home’,’ kicu nei’)  এইখানে ডিকশনারিতে home নামে কোন key নেই সেক্ষত্রে ৩ নং স্টেপ কোন কিছু পাওয়া যায় নেই কিন্তু ৪নং স্টেপ আমরা default ‘kicu nei’ নামে সেট করায় home নামে কিছু না থাকায় আমাদের ‘kicu nei’ আউটপুট দেখাচ্ছে ।
 
key আছে কিনা তা চেক করা
কোন ডিকশনারিতে কোন নির্দিষ্ট key আছে কিনা সেটা পরীক্ষা করার জন্য আমরা in ব্যবহার করে থাকি । যদি key টা থাকে তবে True রিটার্ন করবে, না থাকলে False রিটার্ন করবে।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

'home' in this_dict 
## False 

'name' in this_dict 
## True

 

items()
ডিকশনারিকে এবং এর আইটেমগুলো কে লিস্ট এ রূপান্তর করতে আমরা এই ফাংশনটি ব্যবহার করতে পারি। লিস্টের ভিতর প্রতিটা আইটেম টাপল হিসাবে থাকে। প্রতিটা টাপলের 0 নম্বর ইনডেক্সে থাকে key আর 1 নম্বর ইনডেক্সে থাকে value ।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(this_dict.items()) 
## dict_items([('name', 'Masum Rana'), ('nickname', 'masum'), ('age', '24')])

 

 
keys()
ফাংশন এর সবগুলো key কে লিস্ট হিসেবে পেতে চাইলে আমরা এই ফাংশন ব্যবহার করতে পারি।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(this_dict.keys()) 
## dict_keys(['name', 'nickname', 'age'])

 

 
values()
ফাংশন এর সবগুলো ভ্যালু কে লিস্ট হিসেবে পেতে চাইলে আমরা এই ফাংশন ব্যবহার করতে পারি।
 
this_dict ={'name': 'Masum Rana', 'nickname': 'masum', 'age':'24'} 
print(this_dict) 
## {'name': 'Masum Rana', 'nickname': 'masum', 'age': '24'} 

print(this_dict.values()) 
## dict_values(['Masum Rana', 'masum', '24'])
 
 
setdefault()
ধরা যাক,একটি ডিকশনারিতে একটি key যদি থাকে , তাহলে আমরা ওইটায় হাত দিব না , আর যদি না থাকে তাইলে আমরা তার ভ্যালু সহ, key টা জেনারেট করে দিব। নিচের উদাহরণ দেখা যাকঃ
 
python3 my_dict ={ 'one' : 25, 'three':50 } 
my_dict.setdefault('two',22) 
my_dict.setdefault('one',2) 

print(my_dict) 
## Output: 
## {'one': 25, 'three': 50, 'two': 22}

 

তাহলে দেখা যাচ্ছে , ‘two’ এই key ছিল না বলেই ‘two’ জেনারেট হয়ে গিয়েছে ২২ ভ্যালু সহ । ‘one’ এই key ছিল না , তাই ওইটার ভ্যালু ২ সেট করে দিলেও আপডেট হয় নি ।
 
update()
ধরা যাক, একটি ডিকশনারি আছে , তার মধ্যে অন্য আরেকটি ডিকশনারি দিয়ে আপডেট করবো কিন্তু নেস্টেড করা যাবে না। নিচের উদাহরণ দেখা যাকঃ

 

python3
dict_1 = {
'monday' : '8h',
'tuesday' : '10h',
'wednesday' : '15h'
}


dict_2 ={
'thurseday' : '1h',
'friday' : '5h'
}

dict_1.update(dict_2)


print(dict_1)
print(dict_2)

## Output:
## {'monday': '8h', 'tuesday': '10h', 'wednesday': '15h', 'thurseday': '1h', 'friday': '5h'}
## {'thurseday': '1h', 'friday': '5h'}

 

সুতরাং , আমরা আমাদের টার্গেট অর্জন করেছি । আবার, dict_2 ডিকশনারি ও কিন্তু অক্ষত আছে !
উদাহরন
উদাহরন ১
Creating an empty dictionary
my_dict = {}


a = 10
b = 20
c = 30
# make a dictionary with above (a,b,c) variable and it's value
my_dict = dict(a=10 ,b=20, c=30)
print(my_dict)


# access 'a' from the dictionary
print(my_dict['a'])


# update the value of key 'b' with None
my_dict['b'] = None
print(my_dict)

উদাহরন ২

# remove 'c' key from the dictionary
del my_dict['c']
print(my_dict)
# add an key named 'new' in the dictionary
my_dict['new'] = 150
print(my_dict)
# conquer anothe dictionary to this dictionary
another = {'hi': 'world', 'hello': 'world'}
my_dict.update(another)
print(my_dict)
# get only values and show it
values = list(my_dict.keys())
print(values)

উদাহরন ৩

# get vs [] for retrieving elements 
my_dict = {'name': 'Akash', 'age': 26} 

# Output: Jack 
print(my_dict['name'])
# Output: 26 
print(my_dict.get('age')) 
# Trying to access keys which doesn't exist throws error 
# Output None 
print(my_dict.get('address')) 
# KeyError 
print(my_dict['address'])

উদাহরন ৪

import operator

d = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}

print('Original dictionary : ',d)

sorted_d = sorted(d.items(), key=operator.itemgetter(1))

print('Dictionary in ascending order by value : ',sorted_d)

sorted_d = dict( sorted(d.items(), key=operator.itemgetter(1),reverse=True))

print('Dictionary in descending order by value : ',sorted_d)

উদাহরন ৫

from heapq import nlargest

my_dict = {'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20}

three_largest = nlargest(3, my_dict, key=my_dict.get)

print(three_largest)

 

এসো নিজে করি
some = {
  'asif': {
    'roll' : 10,
    'subject' : ['bangla', 'english'],
    'phone' : "054545454"
  },
  'rayhan': {
    'roll' : 20,
    'subject' : ['history', 'geology'],
    'phone' : "054545454",
    'child':{
      'rony' : [500,1000,1500,True]
    }
  },
}
* উপরের Dictionary থেকে True প্রিন্ট করুন
* ‘child’ key টি রিমুভ করুন
* উপরের প্রত্যেকের নাম দিয়ে একটি লিস্ট তৈরি করুন

***Dictionary তে সর্বোচ্চ মানের key খুঁজে পেতে একটি পাইথন প্রোগ্রাম লিখুন।

* প্রদত্ত Dictionary তে সর্বাধিক মানের key খুঁজে পেতে এবং ফেরত দিতে dict.get() তে সেট করা key প্যারামিটার সহ max() ব্যবহার করুন।
* প্রদত্ত Dictionary তে ন্যূনতম মানের key খুঁজে পেতে এবং ফেরত দিতে dict.get() এ সেট করা কী প্যারামিটারের সাথে min() ব্যবহার করুন।

*** একটি flat dictionary তে অভিধানে সমস্ত key গুলির একটি flat list তৈরি করতে একটি পাইথন প্রোগ্রাম লিখুন।

* প্রদত্ত dictionary তে key গুলি ফেরত দিতে dict.keys() ব্যবহার করুন।
* পূর্ববর্তী ফলাফলের একটি list() ফেরত দিন।

ইন্টারভিউ প্রশ্নোত্তর
গুরুত্বপূর্ন প্রশ্নসমুহ
* ( key, value ) pair বলতে কি বুঝেন ?
* Dictionary কি immutable ?
* Dictionary এর key গুলো কিভাবে পাওয়া যায় ?
* get() মেথড এর কাজ বুঝিয়ে বলেন ?
* Nested dictionary তে item গুলিতে, item গুলি কীভাবে অ্যাক্সেস করবেন ?