0

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

助けてくれてありがとう!

4

1 に答える 1

0

dict.setdefaultあなたの場合はセットを返します。Andset.updateはインプレース操作です。つまり、元のセットを変更してNoneを返します。したがって、結果を変数に代入する場合は、単にNoneを代入します。

于 2013-08-03T22:46:18.587 に答える