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])
印刷出力は次のようになります。
恕 {'口心女'} >>なし 靛 {'亠宀月疋二青土'} >>なし
k_rad を設定するために以下の 2 行を代入すると:
k_rad[k] = k_rad.setdefault(k, set())
k_rad[k].update(set(v['radical']['multi_radical']))
私の出力は次のようになります。
靛 {'亠宀月疋二青土'} >> {'亠宀月疋二青土'} 恕 {'口心女'} >> {'口心女'}
setdefault を理解していれば (明らかに理解していません)、出力は同じはずですよね? 私は何が欠けていますか?なぜdict.setupdate(key,set()).update(set(...))
Noneを返すのですか?
以下で指摘されているように、問題は update が None を返すことです。update と setdefault がどのように連携するのか、私は本当に理解していませんでした。setdefault は、新しい dict 要素を作成し、ハッシュを返し、要素を更新する場合、dict をデフォルトに設定するため、割り当ては必要ありませんでした。私が本当に必要としていたのは:
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'])
助けてくれてありがとう!