python setdefault(key,set()))。update(...返回None

时间:2013-08-03 22:41:33

标签: python set 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']))

我的输出如下:


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

如果我理解setdefault,(显然我没有)输出应该是相同的,对吧? 我错过了什么?为什么dict.setupdate(key,set()).update(set(...))返回无?


如下所述,问题是更新返回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'])

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

dict.setdefault会在您的案例中返回一个集合。 set.update是就地操作,这意味着它会更改原始设置并返回。因此,如果您将结果分配给变量,则只需为其指定