ডি

ডিক্ট মধ্যে Python

37টি অনুশীলনী

ডিক্ট সম্পর্কে

পাইথনে একটি ডিকশনারি (dict) হলো এমন একটি ডেটা স্ট্রাকচার, যা হ্যাশেবল কী (key)-এর সাথে মান যুক্ত করে। অন্য প্রোগ্রামিং ভাষায় এটিকে আকার পরিবর্তনযোগ্য হ্যাশ টেবিল, হ্যাশম্যাপ বা অ্যাসোসিয়েটিভ অ্যারে নামে জানা যায়। ডিকশনারি পাইথনের একমাত্র বিল্ট-ইন ম্যাপিং টাইপ।

keys অবশ্যই হ্যাশেবল হতে হবে এবং ডিকশনারি জুড়ে অনন্য হতে হবে। কী (key)-এর টাইপের মধ্যে থাকতে পারে numbers, strs বা tuples (ইমিউটেবল মানের)। এগুলোতে মিউটেবল ডেটা স্ট্রাকচার যেমন lists, dicts বা sets থাকতে পারে না। পাইথন 3.7 থেকে, dict-এর কী (key)-এর ক্রম এন্ট্রি যেভাবে যোগ করা হয় সেই ক্রমেই নিশ্চিত করা হয়।

values যেকোনো ডেটা টাইপ বা স্ট্রাকচারের হতে পারে। মানগুলো যথেচ্ছভাবে নেস্টও হতে পারে, তাই এতে অ্যারে-এর ভেতরে অ্যারে, সাব-ডিকশনারি এবং অন্য কাস্টম বা যৌগিক ডেটা স্ট্রাকচার থাকতে পারে।

একটি key দিলে ডিকশনারি (গড়ে) ধ্রুবক সময়ে একটি value বের করতে পারে (এন্ট্রির সংখ্যা নির্বিশেষে)। একটি list বা array-এর ভেতরে মান খোঁজার (index অবস্থান না জেনে) তুলনায় একটি dict উল্লেখযোগ্যভাবে বেশি মেমরি ব্যবহার করে, কিন্তু অনেক দ্রুত মান বের করে।

বিশেষত এমন পরিস্থিতিতে ডিকশনারি দারুণ উপযোগী, যেখানে উপাদানের সংগ্রহ বড় হয় এবং সেগুলো ঘন ঘন অ্যাক্সেস ও আপডেট করতে হয়।

ডিকশনারি তৈরি

ডিকশনারি অনেক ভিন্ন উপায়ে তৈরি করা যায়, যেমন:

  • fromkeys() ক্লাস মেথড ব্যবহার করে।
  • ডিকশনারি কম্প্রিহেনশন ব্যবহার করে।
  • আনপ্যাকিং (**) দিয়ে দুটি ডিকশনারি একত্র করা।
  • | (আপডেট) অপারেটর দিয়ে ডিকশনারি একত্র করা।
  • লুপ ব্যবহার করে আগে তৈরি করা একটি খালি dict-এ ধাপে ধাপে এন্ট্রি যোগ করা।

সবচেয়ে সোজা দুটি পদ্ধতি হলো ডিকশনারি কনস্ট্রাক্টর এবং ডিকশনারি লিটারাল।

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

dict() (dict ক্লাসের কনস্ট্রাক্টর) key, value জোড়ার যেকোনো ইটারেবল-এর সাথে ব্যবহার করা যায়। এছাড়া ধারাবাহিক <name>=<value> আর্গুমেন্ট দিয়েও এটি কল করা যায়:

# Passing a list of key,value tuples.
>>> wombat = dict([('name', 'Wombat'),
...              ('speed', 23),
...              ('land_animal', True)])
{'name': 'Wombat', 'speed': 23, 'land_animal': True}


# Using key=value arguments.
>>> bear = dict(name="Black Bear",
...             speed=40,
...             land_animal=True)
{'name': 'Black Bear', 'speed': 40, 'land_animal': True}

dict সম্পর্কিত ডকুমেন্টেশন-এ কনস্ট্রাক্টর ব্যবহারের আরও কিছু ভিন্নতা ও বিকল্প তুলে ধরা হয়েছে।

ডিকশনারি লিটারাল

একটি ডিকশনারি সরাসরি ডিকশনারি লিটারাল হিসেবেও লেখা যায়, যেখানে দ্বিতীয় বন্ধনী ({}) দিয়ে key : value জোড়া ঘেরা হয়। {}-এর ভেতরে থাকা এন্ট্রিগুলো আলাদা আলাদা লাইনে-ও লেখা যায়:

>>> whale = {"name": "Blue Whale", 
             "speed": 35, 
             "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}

>>> wombat = {'name': 'Wombat',
              'speed': 23,
              'land_animal': True,
              'color': 'Brindle'}

>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True, 'color': 'Brindle'}

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

ডিকশনারি যথেচ্ছভাবে নেস্ট করা যায়:

animals = {
    "Real" : {
        "Winged" : {
            "Sparrow" : {'name': 'sparrow','speed': 12, 'land_animal': True},
            "Kestrel" : {'name': 'kestrel', 'speed': 15, 'land_animal': True}
           },
        "Legged" : {
            "Wombat" : {'name': 'Wombat', 'speed': 23, 'land_animal': True},
            "Black Bear": {'name': 'Black Bear', 'speed': 40, 'land_animal': True},
            "Polecat" : {'name': 'Polecat', 'speed': 15, 'land_animal': True}
           },
        "Other" :  {
            "Whale" : {'name': 'Blue Whale', 'speed': 35, 'land_animal': False},
            "Orca" : {'name': 'Orca', 'speed': 45, 'land_animal': False},
            "Snake" : {'name': 'Python', 'speed': 25, 'land_animal': True}
            }
        },
        
    "Imaginary": {
        "Winged" : {
            "Dragon" : {'name': 'Fire Dragon','speed': 100, 'land_animal': True},
            "Phoenix" : {'name': 'Phoenix', 'speed': 1500, 'land_animal': True}
            },
        "Legged" : {
            "Sphinx" : {'name': 'Sphinx','speed': 10, 'land_animal': True},
            "Minotaur" : {'name': 'Minotaur', 'speed': 5, 'land_animal': True}
            },
        "Other" :  {}
        }
   }

একটি dict-এ মান অ্যাক্সেস করা

তৃতীয় বন্ধনীর ভেতরে একটি কী (key) ব্যবহার করে আপনি ডিকশনারির একটি value অ্যাক্সেস করতে পারেন। ডিকশনারিতে কোনো কী (key) না থাকলে একটি KeyError উত্থাপিত হয়:

>>> bear["speed"]
40

>>> bear["color"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'color'

get(<key>, <default value>) মেথড দিয়ে একটি এন্ট্রি অ্যাক্সেস করলে KeyError এড়ানো যায়:

>>> bear.get("color", 'not found')
'not found'

নেস্টেড ডিকশনারি এন্ট্রি অ্যাক্সেস করা

নেস্টেড ডিকশনারির এন্ট্রি অ্যাক্সেস করতে ধারাবাহিকভাবে বন্ধনী ব্যবহার করুন। কোনো নির্দিষ্ট কী (key) না থাকলে স্বাভাবিকভাবে KeyError উত্থাপিত হবে:

# Using the animals nested dictionary.
>>> animals["Real"]["winged"]["Kestrel"]["speed"]
15

>>> animals["Imaginary"]["winged"]["Kestrel"]["speed"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Kestrel'

KeyError এড়াতে .get() ব্যবহার করা যায়, তবে .get()-এর কলগুলো চেইন করতে হবে:

# Using the animals nested dictionary.
# Note the use of parenthesis to enable placing the 
# .get() calls on separate lines.
>>> (animals.get("Imaginary", {})
            .get("Legged", {})
            .get("Sphinx", {})
            .get("Color", "I have no idea!"))
'I have no idea!'

ডিকশনারির মান পরিবর্তন বা যোগ করা

এন্ট্রির কী (key)-তে অ্যাসাইন করে আপনি একটি value পরিবর্তন করতে পারেন:

# Assigning the value "Grizzly Bear" to the name key.
>>> bear["name"] = "Grizzly Bear"
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True}

>>> whale["speed"] = 25
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False}

একইভাবে নতুন key:value জোড়া যোগ করা যায়:

# Adding a new "color" key with a new "tawney" value.
>>> bear["color"] = 'tawney'
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True, 'color': 'tawney'}

>>> whale["blowholes"] = 1
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False, 'blowholes': 1}

ডিকশনারি এন্ট্রি মুছে ফেলা (pop করা ও del)

ডিকশনারির একটি এন্ট্রি মুছে ফেলতে আপনি <dict>.pop(<key>) মেথড ব্যবহার করতে পারেন। <dict>.pop() (key, value) জোড়াটি সরিয়ে দেয় এবং ব্যবহারের জন্য value রিটার্ন করে। <dict>.get()-এর মতো <dict>.pop(<key>)-ও একটি দ্বিতীয় আর্গুমেন্ট (<dict>.pop(<key>, <default value>)) নেয়, যা key না পাওয়া গেলে রিটার্ন করা হয়। এতে একটি KeyError উত্থাপিত হওয়া আটকে যায়:

# Using .pop() removes both the key and value, returning the value.
>>> bear.pop("name")
'Grizzly Bear'


# The "name" key is now removed from the dictionary.
# Attempting .pop() a second time will throw a KeyError.
>>> bear.pop("name")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'


# Using a default argument with .pop() will 
# prevent a KeyError from a missing key.
>>> bear.pop("name", "Unknown")
'Unknown'

এক বা একাধিক এন্ট্রি মুছে ফেলতে del স্টেটমেন্ট-ও ব্যবহার করা যায়। মুছে ফেলার এন্ট্রিটি ডিকশনারিতে না থাকলে একটি KeyError উত্থাপিত হয়:

>>> wombat = {'name': 'Wombat',
              'speed': 23,
              'land_animal': True,
              'color': 'Brindle',
              'talent': 'Singing',
              'size': 'small'}

# Remove a single entry from the dictionary.
>>> del wombat["color"]
>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True, 'talent': 'Singing', 'size': 'small'}


# Remove multiple entries from the dictionary.
>>> del wombat["talent"], wombat["size"]
>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True}


# Attempting a deletion of a non-existent key raises a KeyError
>>> del wombat["number_of_legs"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'number_of_legs'

ডিকশনারির মধ্য দিয়ে লুপ করা/ইটারেশন করা

for item in dict বা while item দিয়ে ডিকশনারির মধ্য দিয়ে লুপ করলে ডিফল্টভাবে কী (key)-গুলোর উপর ইটারেশন হয়। একই লুপের ভেতরে তৃতীয় বন্ধনী ব্যবহার করে মান অ্যাক্সেস করতে পারেন:

>>> for key in bear:
...     print((key, bear[key])) # <--This prints a tuple of (key, value).
('name', 'Black Bear')
('speed', 40)
('land_animal', True)

আপনি .items() মেথড-ও ব্যবহার করতে পারেন, যা (key, value) টাপল রিটার্ন করে:

# dict.items() forms (key, value tuples) that can be 
# unpacked and iterated over.
>>> for key, value in whale.items():
...     print(key, ":", value)
name : Blue Whale
speed : 25
land_animal : False
blowholes : 1

একইভাবে, .keys() keys রিটার্ন করবে এবং .values() values রিটার্ন করবে।

পাইথনে ডিকশনারি সম্পর্কে বিস্তারিত জানতে অফিসিয়াল ডকুমেন্টেশন চমৎকার একটি সূচনা, অথবা W3-Schools টিউটোরিয়ালটিও দেখতে পারেন।

ডিকশনারির কার্যকারিতা বাড়ানো: Collections মডিউল

collections মডিউল পাইথনের স্ট্যান্ডার্ড কালেকশন-ভিত্তিক ডেটা টাইপগুলোতে (dict, set, list, tuple) বিশেষ কার্যকারিতা যোগ করে। সবচেয়ে উপযোগী তিনটি ডিকশনারি-ভিত্তিক ক্লাস হলো:

  • Counter স্বয়ংক্রিয়ভাবে উপাদান গণনা করে এবং সেগুলো একটি dict-এ রিটার্ন করে, যেখানে উপাদানগুলো কী (key) আর তাদের গণনা মান হিসেবে থাকে।
  • OrderedDict-এ ডিকশনারি এন্ট্রির ক্রম সাজানোর জন্য বিশেষায়িত মেথড রয়েছে।
  • defaultdict একটি ফ্যাক্টরি মেথড ব্যবহার করে ডিফল্ট মান সেট করে, যখন কোনো ডিকশনারি এন্ট্রি বের করতে বা অ্যাসাইন করতে গিয়ে একটি key না পাওয়া যায়।
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

ডিক্ট শিখুন

অনুশীলন লক করা আছে

ডিক্ট অনুশীলন করতে আরও 4টি অনুশীলনী আনলক করুন