2.9. Szótárak

A szótár (dictionary) kulcsokat értékekhez rendelő leképezés. Minden kulcsot közvetlenül lehet kikeresni; a szótár megjegyzi, hogy az adott kulcshoz utoljára milyen érték tartozott.

2.9.1. Szótárak létrehozása

Használj kapcsos zárójeleket key: value párokkal, vagy a dict konstruktort:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

Az értékek bármilyen típusúak lehetnek – karakterláncok, számok, listák, sőt akár további szótárak is:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
Egy szótár két oszlopként ábrázolva: a kulcsok a bal oldalon, az értékek a jobb oldalon, nyilak kötik össze az egyes párokat.

A szótár minden kulcsa pontosan egy értékhez van rendelve.

2.9.2. Hozzáférés és tagság

A [] operátorral történő indexelés visszaadja egy kulcshoz tartozó értéket. A hiányzó kulcs KeyError kivételt vált ki:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

Engedékenyebb kikereséshez használd a dict.get() metódust. Hiányzó kulcs esetén None értéket ad vissza, vagy egy második argumentumként átadott értéket:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

Az in kulcsszó a kulcs tagságát vizsgálja – nem az értékét:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. Hozzáadás, frissítés és eltávolítás

A d[key] kifejezésnek való értékadás új bejegyzést ad hozzá, ha a kulcs új, és felülírja azt, ha már létezik:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

Az eltávolításnak több formája van:

  • del d[key] – eltávolít egy bejegyzést; KeyError kivételt vált ki, ha a kulcs hiányzik.

  • dict.pop() – eltávolítja és visszaadja az értéket; egy opcionális alapértelmezés segítségével elkerülhető a kivétel.

  • dict.clear() – eltávolít minden bejegyzést.

A dict.update() egy másik szótárt (vagy (key, value) párok listáját) egyesít a fogadóval, felülírva minden egyező kulcsot:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. Iterálás

A szótár közvetlen iterálása a kulcsait adja vissza, beszúrási sorrendben:

for k in person:
    print(k)

Három nézet biztosít kifejezett hozzáférést:

  • dict.keys() – a kulcsok (megegyezik a szótár iterálásával).

  • dict.values() – az értékek.

  • dict.items()(key, value) tuple-ök, amelyek tökéletesen kicsomagolhatók egy ciklusban.

for key, value in person.items():
    print(key, "=", value)

2.9.5. Mi lehet kulcs

A szótár kulcsainak hashelhetőnek kell lenniük – az értékük nem változhat meg az élettartamuk során. A gyakori hashelhető típusok a következők:

A változtatható típusok, mint a list, a dict és a bytearray nem lehetnek kulcsok; ilyen használata TypeError kivételt vált ki. A megváltoztathatatlan értékekből álló tuple-ök a szokásos módja annak, hogy egy szótárt összetett azonosító – például egy 2D rácskoordináta – alapján kulcsoljunk:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. Hossz

A len() a bejegyzések számát adja vissza:

>>> len(person)
4