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.
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.
dict() osztálykonstruktorA 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}
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}
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'
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}
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'
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.
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.
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}
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}
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}
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}
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)]
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.