区分两个字典的键集以生成结果字典

3

我有,

dict1={a:1, b:2, c:3}
dict2={a:3, c:7}

我想找出在dict1中存在而在dict2中不存在的键。所以我执行以下操作:

diff_as_set = set(dict1.keys()) - set (dict2.keys())

这给了我:b
然而,我想要一个字典,其中包含dict1中所有不在dict2中的键的所有键值映射,因此我执行以下操作:
diff_as_dict = {k:v for k,v in dict1 if k in diff_as_set}

I get:

diff_as_dict = {k:v for k, v in dict1 if k in diff_as_set}
ValueError: too many values to unpack (expected 2)

有什么想法吗?

我还没有测试过,但这里有一个“setdict”的配方,可以在字典上执行集合操作:http://code.activestate.com/recipes/577471-setdict/ - JCash
3个回答

3

循环遍历字典时只会提供键,你需要使用以下语法:

diff_as_dict = {k:v for k, v in dict1.iteritems() if k in diff_as_set}
                                      ^^^^^^^^^^^

或者在Python 3.x中使用.items()


2

不需要遍历整个字典来挑选与你的集合匹配的元素,只需迭代该集合即可。

diff_as_dict = {k:dict1[k] for k in diff_as_set}

例子:

>>> dict1={'a':1, 'b':2, 'c':3}
>>> dict2={'a':3, 'c':7}
>>> diff_as_set = set(dict1.keys()) - set (dict2.keys())
>>> diff_as_set
set(['b'])
>>> diff_as_dict = {k:dict1[k] for k in diff_as_set}
>>> diff_as_dict
{'b': 2}

1
您缺少.iteritems()部分:
dict1 = {'a':1, 'b':2, 'c':3}
dict2 = {'a':3, 'c':7}
newdict = {k : v for k,v in dict1.iteritems() if not(k in dict2)}

在此之后,newdict 等于 {'b': 2}。这一步完成了所有操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接