In someone else's code I read the following two lines:
x = defaultdict(lambda: 0)
y = defaultdict(lambda: defaultdict(lambda: 0))
As the argument of defaultdict is a default factory, I think the first line means that when I call x[k] for a nonexistent key k (such as a statement like v=x[k]), the key-value pair (k,0) will be automatically added to the dictionary, as if the statement x[k]=0 is first executed. Am I correct?
And what about y? It seems that the default factory will create a defaultdict with default 0. But what does that mean concretely? I tried to play around with it in Python shell, but couldn't figure out what it is exactly.
I think the first line means that when I call
x[k]
for a nonexistent keyk
(such as a statement likev=x[k]
), the key-value pair(k,0)
will be automatically added to the dictionary, as if the statementx[k]=0
is first executed.
That's right. This is more idiomatically written
x = defaultdict(int)
In the case of y
, when you do y["ham"]["spam"]
, the key "ham"
is inserted in y
if it does not exist. The value associated with it becomes a defaultdict
in which "spam"
is automatically inserted with a value of 0
.
I.e., y
is a kind of "two-tiered" defaultdict
. If "ham" not in y
, then evaluating y["ham"]["spam"]
is like doing
y["ham"] = {}
y["ham"]["spam"] = 0
in terms of ordinary dict
.