2013-10-29 70 views
0

如果還有更好的方法來完成此操作嗎?默認字典默認爲帶有預生成密鑰的字典

from functool import partial 
from collections import defaultdict 

dict_factory = partial(dict, {'flag_name' : False, 
           'flag_name2' : False, 
           'flag_name3' : True, etc.} 

self.ids_with_flags_dictionary = defaultdict(dict_factory) 

這裏的目標是鍵的字典(鍵是某種ID的),如果我調用之前沒有被稱爲的ID自動生成的默認船旗國名單。

+3

這種方法有什麼問題? – 2013-10-29 20:23:45

+1

對我來說很好,你覺得這裏有什麼不對? –

+0

'dict_factory = lambda:{'flag_name':False,'flag_name2':False,...}'工作原理相同,稍微簡單一些。 – chepner

回答

2

完全沒有問題,但使用partial似乎有點矯枉過正,只是爲了返回一個靜態值。爲什麼不乾脆:

defaultFlags = {'flag_name' : False, 
'flag_name2' : False, 
'flag_name3' : False, 
# etc. 
} 

self.ids_with_flags_dictionary = defaultdict(lambda: defaultFlags.copy()) 
+0

這比我的「解決方案」更加明顯和簡單。謝謝。 – bendersalt

0

你可以使用一個lambdadict.fromkeys

In [15]: x = collections.defaultdict(
      lambda: dict.fromkeys(
       ['flag_name', 'flag_name2', 'flag_name3'], False)) 

In [16]: x['foo'] 
Out[16]: {'flag_name': False, 'flag_name2': False, 'flag_name3': False} 

或者,以適應任意類型的字典,剛剛從lambda返回字典:

In [17]: x = collections.defaultdict(lambda: {'flag_name': False, 'flag_name2': False, 'flag_name3': False}) 

In [18]: x['foo'] 
Out[18]: {'flag_name': False, 'flag_name2': False, 'flag_name3': False} 
+0

啊是的,但我沒有提到並非所有的鍵都以默認值False開始。對於那個很抱歉。 – bendersalt