在别人的代码中,我读到了以下两行:
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中使用它,但不知道它到底是什么。
你做的第一件事是对的。至于
y
,当y
中不存在键时,它将创建默认为0的defaultdict,因此可以将其视为嵌套字典。请考虑以下示例:要创建一个没有defaultdict的等价嵌套字典结构,您需要为
y['k1']
创建一个内部dict,然后将y['k1']['k2']
设置为0,但是当defaultdict遇到它没有看到的键时,它会在幕后执行所有这些操作:以下功能可能有助于在口译员上使用此功能,以便更好地理解:
这将返回与嵌套的defaultdict相当的dict,它更易于阅读,例如:
defaultdict
接受对其构造函数可调用的零参数,正如您正确解释的那样,在找不到键时调用该参数。lambda: 0
当然总是返回零,但是首选的方法是defaultdict(int)
,它也会执行相同的操作。至于第二部分,只要在顶级字典中找不到键,作者就希望创建一个新的
defaultdict(int)
,或者一个嵌套字典。没错。这句话写得更习惯
在
y
的情况下,当您执行y["ham"]["spam"]
操作时,如果键"ham"
不存在,则将其插入y
。与之关联的值变为defaultdict
,其中"spam"
自动插入值为0
。也就是说,
y
是一种“两层”defaultdict
。如果"ham" not in y
,那么计算y["ham"]["spam"]
就像就普通的
dict
而言。相关问题 更多 >
编程相关推荐