Python-এর dict ক্লাসটি ডিকশনারি নিয়ে কাজ করার জন্য অনেকগুলো কাজের মেথড দেয়।
এর কয়েকটি dict-এর ধারণা পাতায় আগেই আলোচনা করা হয়েছে।
এখানে আরও কয়েকটি মেথড দেখব, সাথে ডিকশনারির ভেতর দিয়ে ইটারেট করার ও সেগুলো নিয়ে কাজ করার কিছু কৌশলও।
<dict>.setdefault() কোনো KeyError না তুলেই স্বয়ংক্রিয়ভাবে keys যোগ করে।<dict>.fromkeys(<iterable>, <default value>) যেকোনো সংখ্যক ইটারেবল থেকে একটি নতুন dict তৈরি করে।<dict>.keys(), <dict>.values() ও <dict>.items() সুবিধাজনক ইটারেটর দেয়।sorted(<dict>.items()) সহজেই একটি dict-এর এন্ট্রিগুলো পুনরায় সাজাতে পারে।<dict_one>.update(<dict_two>) একটি dict-কে অন্য একটি dict-এর মিলে যাওয়া values দিয়ে আপডেট করে।<dict> | <other_dict> ও <dict> |= <other_dict> অপারেটরের মাধ্যমে দুটি dict মার্জ বা আপডেট করে।reversed(<dict>.keys()), reversed(<dict>.values()) বা reversed(<dict>.items()) উল্টো ভিউ তৈরি করে।<dict>.popitem() একটি (key, value) জোড়া সরিয়ে ফেলে এবং রিটার্ন করে।setdefault()
ডিকশনারির ধারণা পাতায় আগেই আলোচনা করা হয়েছিল যে, ডিকশনারিতে কোনো key না পাওয়া গেলে <dict>.get(<key>, <default value>) একটি বিদ্যমান value অথবা default value রিটার্ন করে, আর এভাবেই KeyError এড়ানো যায়।
এটি এমন পরিস্থিতিতে ভালো কাজ করে, যেখানে আপনি বাড়তি এরর হ্যান্ডলিং চান না, কিন্তু যে key খুঁজছেন সেটি থাকবে বলে ভরসা করতে পারেন না।
একইভাবে "নিরাপদ" (KeyError ছাড়া) ইনসার্ট করার জন্য আছে <dict>.setdefault(<key>, <default value>) মেথডটি।
ডিকশনারিতে key পাওয়া গেলে <dict>.setdefault(<key>, <default value>) ওই value রিটার্ন করবে।
কী না পাওয়া গেলে এটি (key, default value) জোড়াটি যোগ করবে এবং ব্যবহারের জন্য default value রিটার্ন করবে।
>>> palette_I = {'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd'}
# Looking for the value associated with key "Rock Brown".The key does not exist,
# so it is added with the default value, and the value is returned.
>>> palette.setdefault('Rock Brown', '#694605')
'#694605'
# The (key, default value) pair has now been added to the dictionary.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Rock Brown': '#694605'}
fromkeys()
বিভিন্ন keys ও ডিফল্ট মান দিয়ে দ্রুত একটি ডিকশনারি ভরাতে ক্লাস মেথড fromkeys(<iterable>, <default value>) keys-এর একটি ইটারেবলের ভেতর দিয়ে ইটারেট করে একটি নতুন dict তৈরি করবে।
সব values-এ দেওয়া default valueটিই বসানো হবে:
>>> new_dict = dict.fromkeys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'], 'fill in hex color here')
{'Grassy Green': 'fill in hex color here',
'Purple Mountains Majesty': 'fill in hex color here',
'Misty Mountain Pink': 'fill in hex color here'}
.popitem() দিয়ে একটি (key, value) জোড়া সরিয়ে রিটার্ন করা.popitem() ডিকশনারি থেকে একটি মাত্র (key, value) জোড়া সরিয়ে ফেলে ও রিটার্ন করে।
জোড়াগুলো লাস্ট-ইন-ফার্স্ট-আউট (LIFO) ক্রমে রিটার্ন হয়।
ডিকশনারি খালি থাকলে popitem() কল করলে একটি KeyError উৎপন্ন হবে:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
>>> palette_I.popitem()
('Misty Mountain Pink', '#f9c5bd')
>>> palette_I.popitem()
('Purple Mountains Majesty', '#8076a3')
>>> palette_I.popitem()
('Grassy Green', '#9bc400')
# All (key, value) pairs have been removed.
>>> palette_I.popitem()
Traceback (most recent call last):
line 1, in <module>
palette_I.popitem()
KeyError: 'popitem(): dictionary is empty'
.keys(), .values() ও .items() মেথডগুলো ডিকশনারির ইটারেবল ভিউ রিটার্ন করে।
এই ভিউগুলো ব্যবহার করে এন্ট্রিগুলো না বদলেই সহজে সেগুলোর উপর লুপ করা যায়।
ভিউগুলো _ডাইনামিক_ও -- পেছনের ডিকশনারি ডেটা বদলালে সংশ্লিষ্ট view object সেই পরিবর্তন প্রতিফলিত করে:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
# Using .keys() returns a list of keys.
>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'])
# Using .values() returns a list of values.
>>> palette_I.values()
dict_values(['#9bc400', '#8076a3', '#f9c5bd'])
# Using .items() returns a list of (key, value) tuples.
>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', '#8076a3'), ('Misty Mountain Pink', '#f9c5bd')])
# Views are dynamic. Changing values in the dict
# changes all of the associated views.
>>> palette_I['Purple Mountains Majesty'] = (128, 118, 163)
>>> palette_I['Deep Red'] = '#932432'
>>> palette_I.values()
dict_values(['#9bc400', (128, 118, 163), '#f9c5bd', '#932432'])
>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink', 'Deep Red'])
>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', (128, 118, 163)), ('Misty Mountain Pink', '#f9c5bd'), ('Deep Red', '#932432')])
.keys(), .values() ও .items() নিয়ে আরওPython 3.7+ থেকে dicts এন্ট্রি যে ক্রমে ইনসার্ট করা হয় সেই ক্রম ধরে রাখে, ফলে .keys(), .values() বা .items() ব্যবহার করলে ফার্স্ট-ইন-ফার্স্ট-আউট (FIFO) ক্রমে ইটারেশন করা যায়।
Python 3.8+ থেকে ভিউগুলো উল্টো দিকেও চালানো যায়।
এতে reversed(<dict>.keys()), reversed(<dict>.values()) বা reversed(<dict>.items()) ব্যবহার করে keys, values বা (key, value) জোড়াগুলোর উপর লাস্ট-ইন-ফার্স্ট-আউট (LIFO) ক্রমে ইটারেট করা যায়:
>>> palette_II = {'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
>>> for item in palette_II.items():
... print(item)
...
('Factory Stone Purple', '#7c677f')
('Green Treeline', '#478559')
('Purple baseline', '#161748')
>>> for item in reversed(palette_II.items()):
... print(item)
...
('Purple baseline', '#161748')
('Green Treeline', '#478559')
('Factory Stone Purple', '#7c677f')
.update() দিয়ে ডিকশনারি একত্র করা<dict_one>.update(<dict_two>) দিয়ে দুটি ডিকশনারি একত্র করা যায়।
এই মেথড <dict_two>-এর (key,value) জোড়াগুলো নিয়ে <dict_one>-এ লিখে দেবে:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
>>> palette_II = {'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple Baseline': '#161748'}
>>> palette_I.update(palette_II)
# Note that new items from palette_II are added.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Factory Stone Purple': '#7c677f', 'Green Treeline': '#478559', 'Purple Baseline': '#161748'}
দুটি ডিকশনারির keys যেখানে মিলে যায়, সেখানে dict_one-এর value dict_two-এর সংশ্লিষ্ট value দিয়ে ওভাররাইট হয়ে যায়:
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
>>> palette_III = {'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189)}
>>> palette_I.update(palette_III)
# Overlapping values in palette_I are replaced with
# values from palette_III
>>> palette_I
{'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189),
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559', 'Purple baseline': '#161748'}
| ও |=) অপারেটর দিয়ে ডিকশনারি মার্জ বা আপডেট করাPython 3.9 dicts মার্জ করার আরেকটি উপায় নিয়ে এসেছে: union অপারেটর।
dict_one | dict_two একটি নতুন ডিকশনারি তৈরি করবে, যা dict_one ও dict_two-এর (key, value) জোড়া দিয়ে গঠিত।
দুটি ডিকশনারিতেই একই কী থাকলে dict_two-এর মান প্রাধান্য পায়।
>>> palette_I = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd'}
>>> palette_II = {'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
>>> new_dict = palette_I | palette_II
>>> new_dict
...
{'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
dict_one |= other অনেকটা <dict_one>.update(<other>)-এর মতো কাজ করে, তবে এ ক্ষেত্রে other একটি dict অথবা (key, value) জোড়ার একটি ইটারেবল, দুটোর যেকোনোটি হতে পারে:
>>> palette_III = {'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189)}
>>> new_dict |= palette_III
>>> new_dict
...
{'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189),
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
ডিকশনারির জন্য বিল্ট-ইন কোনো সর্টিং মেথড নেই।
তবে বিল্ট-ইন sorted() ফাংশনের সাথে .items() ব্যবহার করে একটি dict ভিউ সাজানো সম্ভব।
এরপর সেই সাজানো ভিউ দিয়ে নতুন একটি ডিকশনারি তৈরি করা যায়।
সর্ট কী নির্দিষ্ট না করলে ডিফল্টভাবে ডিকশনারির keys ধরে সাজানো হয়।
# Default ordering for a dictionary is last in, first out (LIFO).
>>> color_palette = {'Grassy Green': '#9bc400',
'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
# The default sort order for a dictionary uses the keys.
>>> sorted_palette = dict(sorted(color_palette.items()))
>>> sorted_palette
{'Factory Stone Purple': '#7c677f',
'Grassy Green': '#9bc400',
'Green Treeline': '#478559',
'Misty Mountain Pink': '#f9c5bd',
'Purple Mountains Majesty': '#8076a3',
'Purple baseline': '#161748'}
# A sort key can be provided in the form
# of an anonymous function (lambda).
>>> value_sorted_palette = dict(sorted(color_palette.items(), key=lambda color: color[1]))
>>> value_sorted_palette
{'Purple baseline': '#161748',
'Green Treeline': '#478559',
'Factory Stone Purple': '#7c677f',
'Purple Mountains Majesty': '#8076a3',
'Grassy Green': '#9bc400',
'Misty Mountain Pink': '#f9c5bd'}
ডিকশনারিতে নির্ভরযোগ্যভাবে কী ও মান অদলবদল করতে একটু পরিশ্রম লাগে, তবে dict.items() ব্যবহার করে একটি loop বা একটি ডিকশনারি কম্প্রিহেনশনের মাধ্যমে তা করা যায়।
নিরাপদে অদলবদল করতে ধরে নিতে হয় যে dict-এর কী ও মান দুটোই হ্যাশেবল।
color_reference = {'Purple Mountains Majesty': '#8076a3',
'Misty Mountain Pink': '#f9c5bd',
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}
# Creating a new dictionary to hold the swapped entries.
>>> swapped_color_reference = {}
# Iterating through the dictionary, using values as keys.
>>> for key, value in color_reference.items():
... swapped_color_reference[value] = key
>>> swapped_color_reference
{'#8076a3': 'Purple Mountains Majesty',
'#f9c5bd': 'Misty Mountain Pink',
'#7c677f': 'Factory Stone Purple',
'#478559': 'Green Treeline',
'#161748': 'Purple baseline'}
# A dictionary comprehension can also be used to swap entries.
>>> swapped = {value: key for key, value in
color_reference.items()}
>>> swapped
{'#8076a3': 'Purple Mountains Majesty',
'#f9c5bd': 'Misty Mountain Pink',
'#7c677f': 'Factory Stone Purple',
'#478559': 'Green Treeline',
'#161748': 'Purple baseline'}
dict-এ রাখা মানগুলো যদি অনন্য না হয়, তাহলে কী ও মান অদলবদল করার আগে বাড়তি যাচাই দরকার হয়:
# Things become more complicated if there are duplicates in
# potential key values.This dict is arranged by hex, RGB, and HSL
# keys, but values repeat.
>>> extended_colors = {'#8076a3': 'Purple Mountains Majesty',
(128, 118, 163): 'Purple Mountains Majesty',
(21, 28, 0, 36): 'Purple Mountains Majesty',
'#f9c5bd': 'Misty Mountain Pink',
(249, 197, 189): 'Misty Mountain Pink',
(0, 21, 24, 2): 'Misty Mountain Pink',
'#7c677f': 'Factory Stone Purple',
(124, 103, 127): 'Factory Stone Purple',
(2, 19, 0, 50): 'Factory Stone Purple',
'#478559': 'Green Treeline',
(71, 133, 89): 'Green Treeline',
(47, 0, 33, 48): 'Green Treeline'}
# New empty dictionary for holding swapped entries.
>>> consolidated_colors = {}
# Iterating over (key, value) pairs using .items()
>>> for key, value in extended_color_reference.items():
... if value in consolidated_colors: # <--Check if key has already been created.
... consolidated_colors[value].append(key)
... else:
... consolidated_colors[value] = [key] # <--Create a value list with the former key in it.
>>> consolidated_colors
{'Purple Mountains Majesty': ['#8076a3', (128, 118, 163), (21, 28, 0, 36)],
'Misty Mountain Pink': ['#f9c5bd', (249, 197, 189), (0, 21, 24, 2)],
'Factory Stone Purple': ['#7c677f', (124, 103, 127), (2, 19, 0, 50)],
'Green Treeline': ['#478559', (71, 133, 89), (47, 0, 33, 48)]}
ডিকশনারি এবং সেগুলো নিয়ে কাজ করার মেথড সম্পর্কে বিস্তারিত ব্যাখ্যার জন্য অফিসিয়াল টিউটোরিয়াল ও অফিসিয়াল লাইব্রেরি রেফারেন্স চমৎকার শুরু।
Real Python ও Finxter সাইটেও Python ডিকশনারি নিয়ে খুব বিস্তারিত লেখা আছে।
সাজানো নিয়ে আরও জানতে Python ডকুমেন্টেশনের Sorting HOW TO দেখুন।