0

我遇到了 setdefault 问题,并且 union 没有像我期望的那样工作。我的代码如下所示:



    #!/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:



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

我的输出如下所示:

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

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


如下所述,问题在于更新返回无。我真的不明白 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 回答