ट्रैक
/
Python
Python
/
अभ्यास
/
मेचा मंच प्रबंधन
मेचा मंच प्रबंधन

मेचा मंच प्रबंधन

सीखने का अभ्यास

परिचय

Python में dict क्लास डिक्शनरी के साथ काम करने के लिए कई उपयोगी मेथड देती है। इनमें से कुछ dicts वाले कॉन्सेप्ट में बताए गए थे। यहाँ हम कुछ और मेथड देखेंगे, साथ ही डिक्शनरी पर इटरेशन करने और उन्हें बदलने की कुछ तकनीकें भी।

बिना एरर के डालने के लिए setdefault() का उपयोग कीजिए

डिक्शनरी वाले कॉन्सेप्ट में पहले यह बताया गया था कि अगर डिक्शनरी में कोई key न मिले, तो .get(key, <default value>) कोई मौजूद value या default value लौटा देता है, और इस तरह KeyError से बच जाते हैं। यह उन स्थितियों में अच्छा काम करता है जहाँ आप अतिरिक्त एरर हैंडलिंग नहीं चाहते, लेकिन यह भरोसा भी नहीं कर सकते कि जिस key को आप ढूँढ रहे हैं वह मौजूद होगी।

इसी तरह की "सुरक्षित" (बिना KeyError) डालने की प्रक्रिया के लिए .setdefault(key, <default value>) मेथड मौजूद है। अगर key डिक्शनरी में मिल जाती है, तो setdefault(key, <default value>) वह value लौटा देता है। अगर key नहीं मिलती, तो यह (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_I.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'}

व्यू के ज़रिए डिक्शनरी की एंट्री पर इटरेशन करना

.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()) का उपयोग करके की, वैल्यू या (key, value) जोड़ों पर अंत में आओ, पहले जाओ (LIFO) क्रम में इटरेशन किया जा सकता है:

>>> palette_II = {'Factory Stone Purple': '#7c677f', 'Green Treeline': '#478559', 'Purple baseline': '#161748'}

# Iterating in insertion order (First in, first out)
>>> for item in palette_II.items():
...     print(item)
...
('Factory Stone Purple', '#7c677f')
('Green Treeline', '#478559')
('Purple baseline', '#161748')


# Iterating in the reverse direction. (Last in, first out)
>>> for item in reversed(palette_II.items()):
...    print (item)
...
('Purple baseline', '#161748')
('Green Treeline', '#478559')
('Factory Stone Purple', '#7c677f')

डिक्शनरी को क्रम में लगाना

डिक्शनरी में क्रम में लगाने का कोई बिल्ट-इन मेथड नहीं होता। लेकिन dict.items() के साथ बिल्ट-इन फंक्शन sorted() का उपयोग करके किसी dict व्यू को क्रम में लगाया जा सकता है। इसके बाद उस क्रम में लगे व्यू से एक नई डिक्शनरी बनाई जा सकती है। इटरेशन की तरह, डिफॉल्ट क्रम डिक्शनरी की keys के अनुसार होता है।

# Default ordering for a dictionary is insertion order (First in, first out).
>>> 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'}

.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'}

डिक्शनरी और उनके साथ काम करने के मेथड की विस्तृत जानकारी के लिए, आधिकारिक ट्यूटोरियल और आधिकारिक लाइब्रेरी संदर्भ बहुत अच्छी शुरुआत हैं।

Real Python और Finxter पर भी Python डिक्शनरी के बारे में बहुत विस्तृत लेख हैं।

निर्देश

Mecha Munch™, किराना खरीदारी को ऑटोमेट करने वाली एक कंपनी, ने आपको अपने ऑर्डरिंग ऐप पर काम करने के लिए अभी-अभी नौकरी पर रखा है। आपकी टीम को एक MVP (न्यूनतम व्यवहार्य उत्पाद) बनाने का काम मिला है, जो शॉपिंग कार्ट की सभी बुनियादी गतिविधियों को संभालता है और उपयोगकर्ताओं को उनके किराने के ऑर्डर जोड़ने, हटाने और क्रम में लगाने देता है। शुक्र है कि पैसे और चेक-आउट से जुड़े सारे फंक्शन कोई दूसरी टीम संभाल रही है!

1. उपयोगकर्ता के शॉपिंग कार्ट में आइटम जोड़िए

MVP को उपयोगकर्ता को अपने शॉपिंग कार्ट में आइटम जोड़ने की सुविधा देनी चाहिए। यह एक अकेला आइटम हो सकता है या एक साथ कई आइटम। चूँकि यह एक MVP है, आइटम की मात्रा दोहराव से बताई जाती है। अगर उपयोगकर्ता 2 Oranges जोड़ना चाहता है, तो इनपुट इटरेबल में 'Oranges' दो बार आएगा। अगर आइटम पहले से उपयोगकर्ता के कार्ट में है, तो कार्ट में उसकी मात्रा 1 बढ़ाई जानी चाहिए। अगर आइटम कार्ट के लिए नया है, तो उसे 1 की मात्रा के साथ जोड़ा जाना चाहिए।

add_item(<current_cart>, <items_to_add>) फंक्शन बनाइए, जो आर्गुमेंट के तौर पर एक कार्ट डिक्शनरी और जोड़े जाने वाले आइटम का कोई भी लिस्ट जैसा इटरेबल लेता है। इसे उपयोगकर्ता के लिए एक नई या अपडेट की गई शॉपिंग कार्ट डिक्शनरी लौटानी चाहिए।

>>> add_item({'Banana': 3, 'Apple': 2, 'Orange': 1},
              ('Apple', 'Apple', 'Orange', 'Apple', 'Banana'))
{'Banana': 4, 'Apple': 5, 'Orange': 2}

>>> add_item({'Banana': 3, 'Apple': 2, 'Orange': 1},
              ['Banana', 'Orange', 'Blueberries', 'Banana'])
{'Banana': 5, 'Apple': 2, 'Orange': 2, 'Blueberries': 1}

2. उपयोगकर्ता के नोट्स ऐप में लिखे आइटम पढ़िए

अरे नहीं। लगता है प्रोडक्ट टीम फीचर क्रीप में पड़ गई है। वे MVP में कुछ अतिरिक्त सुविधाएँ जोड़ना चाहते हैं। अब ऐप को उपयोगकर्ता के नोट्स ऐप से आइटम पढ़कर एक शॉपिंग कार्ट बनाना होगा। उपयोगकर्ताओं के लिए यह सुविधाजनक है, लेकिन टीम के लिए ज़रा ज़्यादा काम।

read_notes(<notes>) फंक्शन बनाइए, जो आर्गुमेंट के तौर पर कोई भी लिस्ट जैसा इटरेबल ले सके। फंक्शन को आइटम पढ़कर उपयोगकर्ता की शॉपिंग कार्ट यानी डिक्शनरी बनानी चाहिए। हर आइटम को 1 की मात्रा के साथ जोड़ा जाना चाहिए। फिर उपयोगकर्ता का यह नया कार्ट लौटाया जाना चाहिए।

>>> read_notes(('Banana','Apple', 'Orange'))
{'Banana': 1, 'Apple': 1, 'Orange': 1}

>>> read_notes(['Blueberries', 'Pear', 'Orange', 'Banana', 'Apple'])
{'Blueberries' : 1, 'Pear' : 1, 'Orange' : 1, 'Banana' : 1, 'Apple' : 1}

3. रेसिपी के "आइडियाज़" सेक्शन को अपडेट कीजिए

ऐप में एक "आइडियाज़" सेक्शन है, जो अलग-अलग पकवानों की तैयार रेसिपी से भरा रहता है। उपयोगकर्ता इनमें से कोई भी रेसिपी चुन सकता है और उसकी सारी सामग्री अपने आप उसके शॉपिंग कार्ट में जुड़ जाती है। प्रोजेक्ट मैनेजर ने आपसे इन "आइडियाज़" रेसिपी को बदलने का तरीका बनाने को कहा है, क्योंकि कंटेंट टीम सामग्री और मात्रा में लगातार बदलाव करती रहती है।

update_recipes(<ideas>, <recipe_updates>) फंक्शन बनाइए, जो आर्गुमेंट के तौर पर एक "आइडियाज़" डिक्शनरी और रेसिपी अपडेट का एक इटरेबल लेता है। फंक्शन को नई या अपडेट की गई "आइडियाज़" डिक्शनरी लौटानी चाहिए।

>>>update_recipes(
    {'Banana Bread' : {'Banana': 1, 'Apple': 1, 'Walnuts': 1, 'Flour': 1, 'Eggs': 2, 'Butter': 1},
     'Raspberry Pie' : {'Raspberry': 1, 'Orange': 1, 'Pie Crust': 1, 'Cream Custard': 1}},
    (('Banana Bread', {'Banana': 4,  'Walnuts': 2, 'Flour': 1, 'Butter': 1, 'Milk': 2, 'Eggs': 3}),)
    )
...

{'Banana Bread': {'Banana': 4, 'Walnuts': 2, 'Flour': 1, 'Butter': 1, 'Milk': 2, 'Eggs': 3}, 
 'Raspberry Pie': {'Raspberry': 1, 'Orange': 1, 'Pie Crust': 1, 'Cream Custard': 1}}

>>> update_recipes(
    {'Banana Bread' : {'Banana': 1, 'Apple': 1, 'Walnuts': 1, 'Flour': 1, 'Eggs': 2, 'Butter': 1},
    'Raspberry Pie' : {'Raspberry': 1, 'Orange': 1, 'Pie Crust': 1, 'Cream Custard': 1},
    'Pasta Primavera': {'Eggs': 1, 'Carrots': 1, 'Spinach': 2, 'Tomatoes': 3, 'Parmesan': 2, 'Milk': 1, 'Onion': 1}},
    [('Raspberry Pie', {'Raspberry': 3, 'Orange': 1, 'Pie Crust': 1, 'Cream Custard': 1, 'Whipped Cream': 2}),
    ('Pasta Primavera', {'Eggs': 1, 'Mixed Veggies': 2, 'Parmesan': 2, 'Milk': 1, 'Spinach': 1, 'Bread Crumbs': 1}),
    ('Blueberry Crumble', {'Blueberries': 2, 'Whipped Creme': 2, 'Granola Topping': 2, 'Yogurt': 3})]
    )
...

{'Banana Bread': {'Banana': 1, 'Apple': 1, 'Walnuts': 1, 'Flour': 1, 'Eggs': 2, 'Butter': 1}, 
 'Raspberry Pie': {'Raspberry': 3, 'Orange': 1, 'Pie Crust': 1, 'Cream Custard': 1, 'Whipped Cream': 2}, 
 'Pasta Primavera': {'Eggs': 1, 'Mixed Veggies': 2, 'Parmesan': 2, 'Milk': 1, 'Spinach': 1, 'Bread Crumbs': 1},
 'Blueberry Crumble': {'Blueberries': 2, 'Whipped Creme': 2, 'Granola Topping': 2, 'Yogurt': 3}}

4. उपयोगकर्ता के कार्ट के आइटम क्रम में लगाइए

जब उपयोगकर्ता कार्ट में आइटम जोड़ना शुरू कर देता है, तो ऐप उसे अपने आइटम वर्णमाला के क्रम में लगाने देता है। इससे चीज़ें ढूँढना आसान हो जाता है, और तब भी मदद मिलती है जब डेटा भरने में गलती हुई हो, जैसे डेटाबेस में 'potatoes' और 'Potato' दोनों मौजूद हों।

sort_entries(<cart>) फंक्शन बनाइए, जो आर्गुमेंट के तौर पर एक शॉपिंग कार्ट यानी डिक्शनरी लेता है और वर्णमाला के क्रम में लगी एक नई प्रति लौटाता है।

>>> sort_entries({'Banana': 3, 'Apple': 2, 'Orange': 1})
{'Apple': 2, 'Banana':3, 'Orange': 1}

5. ऑर्डर पूरा करने के लिए उपयोगकर्ता की शॉपिंग कार्ट दुकान को भेजिए

ऐप को किसी उपयोगकर्ता का कार्ट ऑर्डर पूरा करने के लिए दुकान तक भेजना होता है। लेकिन दुकान के कर्मचारियों को यह जानना ज़रूरी है कि आइटम दुकान के किस गलियारे में मिलेगा और उसे ठंडा रखने की ज़रूरत है या नहीं। इसलिए (बिना किसी खास वजह के) "फुलफिलमेंट कार्ट" को उल्टे वर्णमाला क्रम में लगाया जाना चाहिए, जिसमें हर आइटम की मात्रा के साथ उसकी जगह और ठंडा रखने की जानकारी भी हो।

send_to_store(<cart>, <aisle_mapping>) फंक्शन बनाइए, जो एक उपयोगकर्ता की शॉपिंग कार्ट और एक डिक्शनरी लेता है, जिसमें हर आइटम के लिए दुकान के गलियारे का नंबर और ठंडा रखने की ज़रूरत के लिए True/False दिया होता है। फंक्शन को एक मिली-जुली "फुलफिलमेंट कार्ट" return करनी चाहिए, जिसमें ग्राहक के माँगे हुए हर आइटम के लिए (मात्रा, गलियारा और ठंडा रखने की जानकारी) हो। आइटम उल्टे वर्णमाला क्रम में दिखने चाहिए।

>>> send_to_store({'Banana': 3, 'Apple': 2, 'Orange': 1, 'Milk': 2},
                  {'Banana': ['Aisle 5', False], 'Apple': ['Aisle 4', False], 'Orange': ['Aisle 4', False], 'Milk': ['Aisle 2', True]})
{'Orange': [1, 'Aisle 4', False], 'Milk': [2, 'Aisle 2', True], 'Banana': [3, 'Aisle 5', False], 'Apple': [2, 'Aisle 4', False]}

6. उपयोगकर्ता के ऑर्डर के हिसाब से स्टोर इन्वेंटरी अपडेट कीजिए

ऐप ग्राहकों के ऑर्डर बस लगातार लेता ही नहीं रह सकता। एक समय ऐसा आएगा जब दुकान के कई उत्पाद खत्म हो जाएँगे। इसलिए आपके ऐप के MVP को हर बार स्टोर इन्वेंटरी अपडेट करनी होगी, जब कोई उपयोगकर्ता अपना ऑर्डर दुकान को भेजता है। वरना ग्राहक ऐसे उत्पाद ऑर्डर कर देंगे जो असल में उपलब्ध ही नहीं हैं।

update_store_inventory(<fulfillment_cart>, <store_inventory>) फंक्शन बनाइए, जो एक "फुलफिलमेंट कार्ट" और एक स्टोर इन्वेंटरी लेता है। फंक्शन को "फुलफिलमेंट कार्ट" में दी गई "ऑर्डर की गई" संख्या के हिसाब से स्टोर इन्वेंटरी की मात्रा घटानी चाहिए और फिर अपडेट की गई स्टोर इन्वेंटरी लौटानी चाहिए। जहाँ किसी आइटम की स्टोर में गिनती 0 हो जाए, वहाँ उस गिनती की जगह 'Out of Stock' संदेश लिखा जाना चाहिए।

>>> update_store_inventory({'Orange': [1, 'Aisle 4', False], 'Milk': [2, 'Aisle 2', True], 'Banana': [3, 'Aisle 5', False], 'Apple': [2, 'Aisle 4', False]},
{'Banana': [15, 'Aisle 5', False], 'Apple': [12, 'Aisle 4', False], 'Orange': [1, 'Aisle 4', False], 'Milk': [4, 'Aisle 2', True]})

{'Banana': [12, 'Aisle 5', False], 'Apple': [10, 'Aisle 4', False], 'Orange': ['Out of Stock', 'Aisle 4', False], 'Milk': [2, 'Aisle 2', True]}
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Python Exercism

मेचा मंच प्रबंधन शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।