2013-08-03 21 views
0

我有像我期望他們能夠與setdefault和不工作的工會問題我的代碼如下所示:蟒蛇setdefault(鍵,設置()))更新(...返回無



    #!/usr/bin/python3.3 
    kanjidic = { 
     '恕': {'radical':{'multi_radical': {'口心女'}}}, 
     '靛': {'radical':{'multi_radical': {'亠宀月疋二青土'}}}, 
    } 
    k_rad = {} 
    for k,v in kanjidic.items(): 
     if 'radical' in v and 'multi_radical' in v['radical']: 
      print (k, set(v['radical']['multi_radical'])) 
      k_rad[k] = k_rad.setdefault(k, set()).update(
       set(v['radical']['multi_radical'])) 
     print('>>', k_rad[k]) 

打印輸出的樣子:

 

    恕 {'口心女'} 
    >> None 
    靛 {'亠宀月疋二青土'} 
    >> None 

如果我代替設置k_rad兩個以下行:



    k_rad[k] = k_rad.setdefault(k, set()) 
    k_rad[k].update(set(v['radical']['multi_radical'])) 

我的輸出看起來像THI S:

 

    靛 {'亠宀月疋二青土'} 
    >> {'亠宀月疋二青土'} 
    恕 {'口心女'} 
    >> {'口心女'} 

如果我理解setdefault,(這顯然我不)輸出應該是一樣的吧? 我錯過了什麼?爲什麼dict.setupdate(key,set()).update(set(...))返回無?


如下所示,問題是更新返回None。我真的不明白 如何更新和setdefault一起工作。由於setdefault將字典設置爲默認值,如果 我們正在創建一個新的字典元素,並返回散列並更新更新元素 我不需要分配。我真正需要的是:



    for k,v in kanjidic.items(): 
     if 'radical' in v and 'multi_radical' in v['radical']: 
      k_rad.setdefault(k, set()).update(v['radical']['multi_radical']) 

感謝您的協助!

+1

它不是'setdefault','update'更新set(由'setdefault'返回)in-place並返回None。 –

+0

謝謝。這確實是一個更新。 –

回答

0

dict.setdefault返回一個你的情況。 set.update是就地操作,這意味着它會更改原始設置並返回。所以如果你把結果賦給一個變量,你只要給它分配一個

+0

有沒有比setdefault/update更乾淨的方法? –

+0

您可以看看[defaultdict](http://docs.python.org/3/library/collections.html#collections.defaultdict)。 – zhangyangyu

+0

我不認爲這會奏效。我不知道我會事先打什麼,我想更新一套,所以追加將無法正常工作。 –