Python defaultdict和lambd

2024-04-19 14:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在别人的代码中,我读到了以下两行:

x = defaultdict(lambda: 0)
y = defaultdict(lambda: defaultdict(lambda: 0))

由于defaultdict的参数是一个默认工厂,我认为第一行意味着当我为一个不存在的键k(例如v=x[k]这样的语句)调用x[k]时,键值对(k,0)将自动添加到字典中,就像语句x[k]=0是第一次执行一样。我说的对吗?

那你呢?默认工厂似乎将创建默认为0的defaultdict。但这具体意味着什么?我试着在Python shell中使用它,但不知道它到底是什么。


Tags: lambda代码参数字典工厂语句shell键值
3条回答

你做的第一件事是对的。至于y,当y中不存在键时,它将创建默认为0的defaultdict,因此可以将其视为嵌套字典。请考虑以下示例:

y = defaultdict(lambda: defaultdict(lambda: 0))
print y['k1']['k2']   # 0
print dict(y['k1'])   # {'k2': 0}

要创建一个没有defaultdict的等价嵌套字典结构,您需要为y['k1']创建一个内部dict,然后将y['k1']['k2']设置为0,但是当defaultdict遇到它没有看到的键时,它会在幕后执行所有这些操作:

y = {}
y['k1'] = {}
y['k1']['k2'] = 0

以下功能可能有助于在口译员上使用此功能,以便更好地理解:

def to_dict(d):
    if isinstance(d, defaultdict):
        return dict((k, to_dict(v)) for k, v in d.items())
    return d

这将返回与嵌套的defaultdict相当的dict,它更易于阅读,例如:

>>> y = defaultdict(lambda: defaultdict(lambda: 0))
>>> y['a']['b'] = 5
>>> y
defaultdict(<function <lambda> at 0xb7ea93e4>, {'a': defaultdict(<function <lambda> at 0xb7ea9374>, {'b': 5})})
>>> to_dict(y)
{'a': {'b': 5}}

defaultdict接受对其构造函数可调用的零参数,正如您正确解释的那样,在找不到键时调用该参数。

lambda: 0当然总是返回零,但是首选的方法是defaultdict(int),它也会执行相同的操作。

至于第二部分,只要在顶级字典中找不到键,作者就希望创建一个新的defaultdict(int),或者一个嵌套字典。

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.

没错。这句话写得更习惯

x = defaultdict(int)

y的情况下,当您执行y["ham"]["spam"]操作时,如果键"ham"不存在,则将其插入y。与之关联的值变为defaultdict,其中"spam"自动插入值为0

也就是说,y是一种“两层”defaultdict。如果"ham" not in y,那么计算y["ham"]["spam"]就像

y["ham"] = {}
y["ham"]["spam"] = 0

就普通的dict而言。

相关问题 更多 >