2013-08-22 30 views
4

在Python,如果你有一個包含名單的像CoffeeScript的字典中設置默認

mydict = {'foo': [], 'bar':[3, 4]} 

字典,如果你想添加一些內容,列出你可以做

mydict.setdefault('baz', []).append(5) 

不寫

key, list_element = 'baz', 5 
if key in mydict: 
    mydict[key].append(list_element) 
else: 
    mydict[key] = [list_element] 

在Coffeescript中是否存在這個等價物?

+1

在Python中,你真正想要的可能是'collections.defaultdict(list)'。然後附加一個值是'mylist ['baz']。append(5)'。 (另外,'mylist'是一個字典的誤導性名字。) – user2357112

+0

對不起,修正:) – oguzalb

+1

對Python代碼使用setdefault而不是'collections.defaultdict'非常好,我更喜歡它,因爲你仍然在使用常規字典,因此當引用不存在的元素而不是空列表(或任何其他defaultdict創建的)時,您將獲得KeyErrors。 –

回答

1

這裏有一個選項:

(mydict.baz or (mydict.baz = [])).push(5) 

在這種情況下,CoffeeScript的極其相似,它生成JavaScript:

(mydict.baz || (mydict.baz = [])).push(5); 
+1

還有'(mydict.baz || = [])。push(6)'如果你不想提兩次'baz'。 –

0

如果你不介意使用underscore.js

http://underscorejs.org/#defaults

var iceCream = {flavor : "chocolate"}; 
_.defaults(iceCream, {flavor : "vanilla", sprinkles : "lots"}); 
=> {flavor : "chocolate", sprinkles : "lots"} 
8

我建議不要使用||/or來測試成員,它基本上是一個聰明的技巧,將失敗默默對falsy值。我更喜歡寫

(mydict[ name ]?= []).push value 

我覺得更清晰;它假定如果mydict沒有name或 條目的值爲nullundefined的條目,則應在此處放置一個空列表。