Maison > Questions et réponses > le corps du texte
大家讲道理2017-04-18 10:09:26
Vous pouvez mettre en œuvre cette structure vous-même.
Dans l'exemple suivant, AutoVivification hérite de dict
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
Nous pouvons utiliser l'AutoVivification comme ceci :
item = AutoVivification()
item['20161101']["age"] = 20
item['20161102']['num'] = 30
print item
Sortie :
{'20161101': {'age': 20}, '20161102': {'num': 30}}
De plus, il existe une autre méthode d'implémentation d'AutoVivification, qui consiste à surcharger directement la __missing__
méthode magique de dict. Considérez-le comme une extension.
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __missing__(self, key):
value = self[key] = type(self)()
return value
Encore une chose, les versions après Python 2.5 ont ajouté le type collections.defaultdict
, qui peut personnaliser un type de dict plus évolutif. Le document
souligne que le principe de mise en œuvre est de surcharger la méthode __missing__
. L'AutoVivification peut aussi s'exprimer ainsi :
item = defaultdict(dict) # 其实现与AutoVivification的实现完全一样
item['20161101']["age"] = 20
item['20161102']['num'] = 30
print item
defaultdict construit un type dict dont le premier paramètre est son default_factory Lorsque __missing__
est appelé, la valeur de retour est construite en utilisant default_factory.
Plus d'exemples de defaultdict
PHP中文网2017-04-18 10:09:26
Je joindrai l'utilisation du package defaultdict :
from collections import defaultdict
item = defaultdict(dict)
item['20161101']['age'] = 20
print item
Sortie :
defaultdict(<type 'dict'>, {'20161101': {'age': 20}})
De cette façon, vous pouvez obtenir l'effet souhaité,
Supplément :
defaultdict() reçoit un paramètre par défaut, qui peut être un nom de type ou n'importe quelle fonction appelable sans paramètres
C'est très utile
item = defaultdict(lambda:0)
print item['num']
Sortie :
0