2016-08-17 119 views

回答

3

default_factory參數defaultdict應該是不接受它創建並返回一個對象,這將成爲獲得任何引用不存在的項的值的任何參數的函數。

提供這種功能的一種方法是使用內聯lambda expression創建一個匿名類。另一種方法是使用內置函數的名稱創建並返回其中一種內置類型,如float,int,tuple等。當任何那些被調用時沒有參數時,返回的對象會有一些默認值 - 通常是零或空的東西。

my_var = collections.defaultdict(
      lambda: collections.defaultdict(
       collections.defaultdict(float))) 

但是,(在這兩種形式),這是不正確的,因爲一些defaultdict電話沒有:

首先,您可以通過格式化像這樣讓這樣的代碼,你有更多的可讀可調用的函數參數。因爲Python是一種解釋型語言,所以直到您嘗試使用my_var時纔會知道這一點。對於像例如東西:

my_var['level1']['level2']['level3'] = 42. 

會導致:

my_var = collections.defaultdict(
      lambda: collections.defaultdict(
       lambda: collections.defaultdict(float))) # need lambda here, too 

事後前面的分配將不會被考慮:

TypeError: first argument must be callable or None 

這可以通過添加另一個lambda固定一個錯誤。

由於defaultdict是內置dict類的子類,你可以使用json模塊漂亮地打印一個實例:

import collections 

my_var = collections.defaultdict(
      lambda: collections.defaultdict(
       lambda: collections.defaultdict(float))) 

import json # for pretty printing dictionaries 

# Auto-creates the 3 levels of dictionaries needed. 
my_var['level1']['level2']['level3A'] = 42. 

# Similar to above but additionally auto-creates a 
# my_var['level1']['level2']['level3B'] entry with default value of 0.0 
my_var['level1']['level2']['level3C'] = my_var['level1']['level2']['level3B'] + 1 

print(json.dumps(my_var, indent=4)) 

輸出:

{ 
    "level1": { 
     "level2": { 
      "level3A": 42.0, 
      "level3B": 0.0, 
      "level3C": 1.0 
     } 
    } 
} 

我想你應該能夠理解它現在的功能 - 但是如果沒有,請告訴我。

+0

真棒回答。謝謝哥們 –

相關問題