Διαδρομές
/
Python
Python
/
Ασκήσεις
/
Διαχείριση αποθέματος
Διαχείριση αποθέματος

Διαχείριση αποθέματος

Άσκηση εκμάθησης

Εισαγωγή

Ένα λεξικό (dict) στην Python είναι μια δομή δεδομένων που συσχετίζει κατακερματίσιμα κλειδιά με τιμές και είναι γνωστό σε άλλες γλώσσες προγραμματισμού ως πίνακας κατακερματισμού με δυνατότητα αλλαγής μεγέθους, hashmap ή συσχετιστικός πίνακας. Τα λεξικά είναι ο μόνος ενσωματωμένος τύπος αντιστοίχισης της Python.

Τα Keys πρέπει να είναι κατακερματίσιμα και μοναδικά σε όλο το λεξικό. Οι τύποι κλειδιών μπορούν να περιλαμβάνουν numbers, str ή tuples (με αμετάβλητες τιμές). Δεν μπορούν να περιέχουν μεταβλητές δομές δεδομένων όπως lists, dicts ή sets. Από την Python 3.7 και μετά, η σειρά των κλειδιών ενός dict είναι εγγυημένο ότι είναι η σειρά με την οποία εισάγονται οι καταχωρίσεις.

Οι values μπορούν να είναι οποιουδήποτε τύπου δεδομένων ή δομής. Οι τιμές μπορούν επίσης να εμφωλεύονται αυθαίρετα, έτσι ώστε να μπορούν να περιέχουν λίστες από λίστες, υπολεξικά και άλλες προσαρμοσμένες ή σύνθετες δομές δεδομένων.

Δεδομένου ενός key, τα λεξικά μπορούν να ανακτήσουν μια value σε (κατά μέσο όρο) σταθερό χρόνο (ανεξάρτητα από τον αριθμό των καταχωρίσεων). Σε σύγκριση με την αναζήτηση μιας τιμής μέσα σε μια list ή έναν array (χωρίς να γνωρίζεις τη θέση index), ένα 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, πετιέται ένα 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'

Αλλαγή ή προσθήκη τιμών σε ένα λεξικό

Μπορείς να αλλάξεις την value μιας καταχώρισης αναθέτοντας στο 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) καταχωρίσεων λεξικού

Μπορείς να χρησιμοποιήσεις τη μέθοδο .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, από προεπιλογή επαναλαμβάνεις μόνο τα κλειδιά. Μπορείς να προσπελάσεις τις τιμές μέσα στον ίδιο βρόχο χρησιμοποιώντας αγκύλες:

>>> 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 όταν ζητείται.

Τέλος, θα χρειαστεί να υλοποιήσεις μια συνάρτηση που θα επιστρέφει όλα τα ζεύγη κλειδιού-τιμής σε ένα δεδομένο απόθεμα ως list από tuples.

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 από στοιχεία. Η συνάρτηση σου πρέπει να αφαιρεί 1 από το πλήθος ενός στοιχείου για κάθε φορά που αυτό το στοιχείο εμφανίζεται στη list:

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

Τα πλήθη των στοιχείων στο απόθεμα δεν πρέπει να επιτρέπεται να πέσουν κάτω από το 0. Αν ο αριθμός των φορών που ένα στοιχείο εμφανίζεται στη list εισόδου υπερβαίνει το διαθέσιμο πλήθος, η ποσότητα που αναγράφεται για αυτό το στοιχείο πρέπει να παραμένει στο 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.