Szótár feltöltésére a dict.setdefault metódus vagy a defaultdict szótár alkalmazása célszerűbb?

Mind a két nyelvi eszköz arra való, hogy ha egy szótárban nincs egy megadott kulcs, akkor ezt a kulcsot automatikusan felveszi a szótárba egy meghatározható alapértelmezett értékkel.

Ha d egy dict típusú szótár, akkor a d.setdefault(k, default) híváskor a default argumentum kiértékelődik és, amennyiben nincs a k kulcs a szótárban, az így létrejövő objektum lesz a k-hoz rendelt érték, majd e kulcs-érték pár bekerül a d szótárba. A setdefault visszatérési értéke mindig az aktuális kulcshoz tartozó érték.

A defaultdict egy olyan speciális szótár, amely példányosításakor első argumentumként egy paraméter nélküli hívható objektumot kell megadni. Ha e szótárban nincs egy megadott kulcs, akkor ez a hívható objektum lefut és visszatérési értéke lesz a kulcshoz tartozó érték. Ez a kulcs-érték pár bekerül a defaultdict szótárba.

A fő eltérés a kettő között, hogy míg a d.setdefault(k, default) minden hívásnál előállítja a default paraméternek átadott objektumot, addig a defaultdict szótárhoz megadott hívható objektum csak akkor fut le, ha a kulcs nincs a szótárban.

Ez az eltérés sok kulcs esetén jelentős futási időbeli különbséget hozhat.

Ennek szemléltetésére vegyünk egy egyszerű példát. Tegyük fel, hogy rendelkezésre áll egy adatbázis, amelyben a könnyű átláthatóság kedvéért csupán személyneveket és hozzájuk tartozó életkort tárolunk. A feladat az, hogy adott név alapján állítsuk elő a Személy osztály egy példányát, és a név-példány párt egy szótárba gyűjtsük. Kiegészítő követelmény, hogy az egyes Személy példányokban a neveket nagybetűvel tároljuk el. A neveket mint bemeneti adatokat egy sorozatban kapjuk. A sorozatban ugyanaz a név többször is előfordulhat.

Az alábbi programsorokban a feladatot mind setdefault, mind defaultdict alkalmazásával megoldottuk. A Személy osztályban az inicializáláskor a kor értéke vagy a konstruktorból jön, vagy ha itt nem adtuk meg, akkor a név-kor adatokat tároló adatbázisból, amit most egy szótárral modelleztünk. Minden egyes Személy példány létrehozásakor egy tájékoztató üzenetet írunk ki. A bejövő névadatok egy listában állnak rendelkezésre, amelyben a neveket kétszer ismételtük, hogy érzékelhető legyen, hogy mikor kell alapértelmezett értéket a szótáraknak előállítani és mikor nem.

A két megoldás végeredményében ugyanazt adja, de látható, hogy setdefault esetén kétszer annyi Személy példány előállítása történt, mint defaultdict alkalmazása esetében. Mivel példányosításkor a valóságban adatbázis lekérdezés történik, így annak ideje sok példány előállításakor már nem biztos, hogy elhanyagolható.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.