Kurzusok
/
Python
Python
/
Feladatok
/
Készletkezelés
Készletkezelés

Készletkezelés

Tanulófeladat

Bevezetés

A Pythonban a szótár (dict) olyan adatszerkezet, amely hash-elhető kulcsokat rendel értékekhez, más programozási nyelvekben pedig átméretezhető hash-táblaként, hashmapként vagy asszociatív tömbként ismerik. A szótárak a Python egyetlen beépített leképezéstípusa.

A Keys-nek hash-elhetőnek kell lennie, és a szótárban egyedinek. A kulcsok típusa lehet numbers, str vagy tuples (megváltoztathatatlan értékekből). Nem tartalmazhatnak megváltoztatható adatszerkezeteket, például lists, dicts vagy sets. A Python 3.7-től kezdve a dict kulcsainak sorrendje garantáltan az a sorrend, amelyben a bejegyzéseket beszúrtad.

A values bármilyen adattípusú vagy szerkezetű lehet. Az értékek tetszőlegesen egymásba ágyazhatók, így tartalmazhatnak listák listáit, alszótárakat, valamint más egyéni vagy összetett adatszerkezeteket.

Ha adott egy key, a szótárak (átlagosan) állandó idő alatt képesek lekérdezni egy value-t (függetlenül a bejegyzések számától). Ahhoz képest, hogy egy értéket egy list-ben vagy array-ben kell megkeresni (anélkül, hogy ismernéd az index pozícióját), a dict lényegesen több memóriát használ, de a visszakeresés nála sokkal gyorsabb. A szótárak különösen hasznosak olyan helyzetekben, amikor az elemek gyűjteménye nagy, és gyakran kell elérni és frissíteni őket.

Szótár létrehozása

A szótárakat többféleképpen is létrehozhatod. A két legegyszerűbb mód a dict() konstruktor használata vagy egy dict literál deklarálása.

A dict() osztálykonstruktor

A dict() (a szótár osztály konstruktora) bármilyen, key, value párokból álló iterálhatóval használható, vagy <name>=<value> argumentumok sorozatával:

#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}

Szótári literálok

Egy dict közvetlenül is megadható szótári literálként, kapcsos zárójelekkel ({}), amelyek key : value párokat zárnak közre:

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

Értékek elérése egy szótárban

Egy szótár bejegyzését egy kulcs segítségével érheted el szögletes ([]) zárójelekkel. Ha egy key nem létezik a dict-ben, KeyError keletkezik:

>>> bear["speed"]
40

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

A KeyError elkerülhető, ha a bejegyzést a .get(<key>, <default value>) metódussal éred el:

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

Szótárértékek módosítása vagy hozzáadása

Egy bejegyzés value-ját úgy módosíthatod, hogy értéket rendelsz a kulcsához:

#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}

Új key:value párok ugyanígy adhatók hozzá:

# 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}

Szótárbejegyzések eltávolítása (popolása)

A .pop(<key>) metódussal törölhetsz egy szótárbejegyzést. A .pop() eltávolítja a (key, value) párt, és visszaadja a value-t, hogy felhasználhasd. A .get()-hez hasonlóan a .pop(<key>) is elfogad egy második argumentumot (dict.pop(<key>, <default value>)), amelyet akkor ad vissza, ha a key nem található. Ez megakadályozza, hogy KeyError keletkezzen:

#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'

Egy szótár bejárása és iterálása

Ha a for item in dict vagy a while item szerkezettel járod be a szótárat, alapértelmezés szerint csak a kulcsokon iterálsz. Ugyanezen cikluson belül a szögletes zárójelek segítségével férhetsz hozzá az értékekhez:

>>> 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)

A .items() metódust is használhatod, amely automatikusan (key, value) tuple-öket ad vissza:

#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

Hasonlóképpen a .keys() metódus a keys-t, a .values() metódus pedig a values-t adja vissza.

Utasítások

Ebben a feladatban egy készletnyilvántartó rendszert fogsz kezelni.

A készletet a tételnév szerint kell rendszerezni, és nyilván kell tartania a rendelkezésre álló tételek számát.

Foglalkoznod kell a tételek hozzáadásával is. Valahányszor egy tétel megjelenik egy adott listában, a tétel mennyiségét 1-gyel kell növelni a készletben. Azzal is foglalkoznod kell, hogy tételeket törölj a készletből úgy, hogy kérésre 1-gyel csökkented a mennyiségüket.

Végül implementálnod kell egy függvényt, amely egy adott készlet összes kulcs-érték párját tuples-ok list-jeként adja vissza.

1. Készlet létrehozása egy lista alapján

Implementáld a create_inventory(<input list>) függvényt, amely egy bemeneti tétellistából létrehoz egy „készletet”. Egy dict-et adjon vissza, amely minden tételnevet a hozzá tartozó mennyiséggel párosítva tartalmaz.

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

2. Tételek hozzáadása egy listából egy meglévő szótárhoz

Implementáld az add_items(<inventory dict>, <item list>) függvényt, amely egy tétellistát ad hozzá a kapott készlethez:

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

3. Tételek csökkentése a készletben

Implementáld a decrement_items(<inventory dict>, <items list>) függvényt, amely egy tétellistát kap. A függvényed minden alkalommal vonjon le 1-et egy tétel darabszámából, amikor az a tétel szerepel a list-ben:

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

A készletben a tételszámok nem csökkenhetnek 0 alá. Ha egy tétel többször szerepel a bemeneti list-ben, mint amennyi a rendelkezésre álló darabszám, akkor a tételhez tartozó mennyiség 0 maradjon. A további csökkentési kéréseket figyelmen kívül kell hagyni, miután a darabszám elérte a nullát.

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

4. Egy bejegyzés teljes eltávolítása a készletből

Implementáld a remove_item(<inventory dict>, <item>) függvényt, amely egy tételt és annak darabszámát teljesen eltávolítja a készletből:

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

Ha a tétel nem található a készletben, a függvény az eredeti készletet adja vissza változatlanul.

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

5. A készlet teljes tartalmának visszaadása

Implementáld a list_inventory(<inventory dict>) függvényt, amely egy készletet kap, és egy (item, quantity) tuple-okból álló listát ad vissza. A lista csak az elérhető tételeket tartalmazza (amelyek mennyisége nagyobb nullánál):

>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Python Exercism

Készen állsz elkezdeni a(z) Készletkezelés feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.