ট্র্যাক
/
Python
Python
/
অনুশীলনী
/
ইনভেন্টরি ম্যানেজমেন্ট
ইনভেন্টরি ম্যানেজমেন্ট

ইনভেন্টরি ম্যানেজমেন্ট

লার্নিং অনুশীলনী

ভূমিকা

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

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

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

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

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

ডিকশনারি অনেকভাবে তৈরি করা যায়। সবচেয়ে সহজ দুটি উপায় হলো dict() কনস্ট্রাক্টর ব্যবহার করা বা একটি 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}

ডিকশনারিতে মান অ্যাক্সেস করা

তৃতীয় বন্ধনী ([]) দিয়ে একটি কী (key) ব্যবহার করে আপনি ডিকশনারির একটি এন্ট্রি অ্যাক্সেস করতে পারেন। dict-এ 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)-তে অ্যাসাইন করে আপনি তার মান পরিবর্তন করতে পারেন:

#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(<key>) মেথড ব্যবহার করতে পারেন। .pop() (key, value) জোড়াটি মুছে ফেলে এবং ব্যবহারের জন্য value রিটার্ন করে। .get()-এর মতোই, .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'

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

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

>>> for key in bear:
>>>     print((key, bear[key])) #this forms a tuple of (key, value) and prints it.
('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 রিটার্ন করবে।

নির্দেশনা

এই অনুশীলনীতে আপনি একটি ইনভেন্টরি সিস্টেম পরিচালনা করবেন।

ইনভেন্টরিটি আইটেমের নাম অনুযায়ী সাজানো থাকবে এবং কোন আইটেম কত সংখ্যায় আছে তার হিসাব রাখবে।

আপনাকে ইনভেন্টরিতে আইটেম যোগ করার কাজ সামলাতে হবে। কোনো আইটেম একটি নির্দিষ্ট অ্যারেতে যতবার থাকবে, ইনভেন্টরিতে সেই আইটেমের পরিমাণ ঠিক ততবার 1 করে বাড়াতে হবে। এছাড়া অনুরোধ করা হলে পরিমাণ 1 কমিয়ে ইনভেন্টরি থেকে আইটেম মুছে ফেলার কাজও আপনাকে সামলাতে হবে।

সবশেষে, আপনাকে এমন একটি ফাংশন লিখতে হবে যা একটি প্রদত্ত ইনভেন্টরির সব কী (key) ও মানের জোড়া tuples-এর একটি list হিসেবে রিটার্ন করবে।

1. একটি অ্যারের ভিত্তিতে ইনভেন্টরি তৈরি করুন

এমন একটি create_inventory(<input list>) ফাংশন লিখুন যা ইনপুট হিসেবে দেওয়া আইটেমের একটি অ্যারে থেকে একটি "ইনভেন্টরি" তৈরি করে। এটি একটি dict রিটার্ন করবে, যেখানে প্রতিটি আইটেমের নামের সাথে তার নিজ নিজ পরিমাণ জোড়া থাকবে।

>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}

2. একটি অ্যারে থেকে বিদ্যমান ডিকশনারিতে আইটেম যোগ করুন

এমন একটি add_items(<inventory dict>, <item list>) ফাংশন লিখুন যা পাস করা ইনভেন্টরিতে আইটেমের একটি অ্যারে যোগ করে:

>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}

3. ইনভেন্টরি থেকে আইটেম কমান

এমন একটি decrement_items(<inventory dict>, <items list>) ফাংশন লিখুন যা আইটেমের একটি list নেয়। আপনার ফাংশনটি list-এ কোনো আইটেম যতবার থাকবে, প্রতিবার সেই আইটেমের সংখ্যা থেকে 1 কমাবে:

>>> decrement_items({"coal":3, "diamond":1, "iron":5}, ["diamond", "coal", "iron", "iron"])
{"coal":2, "diamond":0, "iron":3}

ইনভেন্টরিতে কোনো আইটেমের সংখ্যা 0-এর নিচে নামা যাবে না। ইনপুট list-এ কোনো আইটেম যতবার আছে, তা যদি উপলব্ধ সংখ্যার চেয়ে বেশি হয়, তবে ওই আইটেমের জন্য লেখা পরিমাণ 0-ই থাকবে। সংখ্যা 0 হয়ে গেলে আরও কমানোর অনুরোধগুলো উপেক্ষা করতে হবে।

>>> decrement_items({"coal":2, "wood":1, "diamond":2}, ["coal", "coal", "wood", "wood", "diamond"])
{"coal":0, "wood":0, "diamond":1}

4. ইনভেন্টরি থেকে একটি এন্ট্রি সম্পূর্ণ মুছে ফেলুন

এমন একটি remove_item(<inventory dict>, <item>) ফাংশন লিখুন যা ইনভেন্টরি থেকে একটি আইটেম ও তার সংখ্যা সম্পূর্ণভাবে মুছে ফেলে:

>>> remove_item({"coal":2, "wood":1, "diamond":2}, "coal")
{"wood":1, "diamond":2}

ইনভেন্টরিতে আইটেমটি না পাওয়া গেলে ফাংশনটি মূল ইনভেন্টরিটি অপরিবর্তিত অবস্থায় রিটার্ন করবে।

>>> remove_item({"coal":2, "wood":1, "diamond":2}, "gold")
{"coal":2, "wood":1, "diamond":2}

5. ইনভেন্টরির সম্পূর্ণ বিষয়বস্তু রিটার্ন করুন

এমন একটি list_inventory(<inventory dict>) ফাংশন লিখুন যা একটি ইনভেন্টরি নেয় এবং (item, quantity) টাপলের একটি অ্যারে রিটার্ন করে। অ্যারেটিতে শুধু উপলব্ধ আইটেমগুলোই (যেগুলোর পরিমাণ শূন্যের চেয়ে বেশি) থাকবে:

>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Python Exercism

ইনভেন্টরি ম্যানেজমেন্ট শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।