2013-08-03 5 views
0

Je vais avoir un problème avec setdefault et les syndicats ne fonctionnent pas comme je les attends à mon code ressemble à:.python setdefault (clé, set())) mise à jour (... retourne Aucun



    #!/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]) 

La sortie d'impression ressemble à:

 

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

Si je remplace les deux lignes ci-dessous pour le réglage k_rad:



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

Ma sortie ressemble thi s:

 

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

Si je comprends setdefault, (qui, évidemment, je ne suis pas), la sortie doit être le même, non? Qu'est-ce qui me manque? Pourquoi suis dict.setupdate(key,set()).update(set(...)) en retournant None?


Comme indiqué ci-dessous, le problème est que la mise à jour renvoie None. Je n'ai vraiment pas compris comment update et setdefault fonctionnent ensemble. Puisque setdefault met la dict à la valeur par défaut si nous créons un nouvel élément dict et renvoyons le hash et la mise à jour met à jour l'élément Je n'avais pas besoin de l'affectation. Tout ce dont j'avais vraiment besoin était:



    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']) 

Merci pour l'aide!

+1

Ce n'est pas 'setdefault',' update' met à jour l'ensemble (retourné par 'setdefault') sur place et renvoie None. –

+0

Merci. Et c'est en effet une mise à jour. –

Répondre

0

dict.setdefault renvoie un ensemble dans votre boîtier. Et set.update est une opération sur place, ce qui signifie qu'il modifie l'ensemble d'origine et renvoie Aucun. Donc, si vous affectez le résultat à une variable, vous lui attribuez simplement un Aucun.

+0

Existe-t-il une façon plus simple de faire cela que setdefault/update? –

+0

Vous pouvez jeter un oeil à [defaultdict] (http://docs.python.org/3/library/collections.html#collections.defaultdict). – zhangyangyu

+0

Je ne pense pas que cela fonctionnerait. Je ne sais pas ce que je vais frapper à l'avance et je veux mettre à jour un ensemble de sorte que l'ajout ne fonctionnera pas. –