使用另一个字典的部分更新一个字典

8

我经常发现自己使用这个结构:

dict1['key1'] = dict2['key1']
dict1['key2'] = dict2['key2']
dict1['key3'] = dict2['key3']

使用字典 dict2 的一个子集来更新 dict1,这种方式被称为“更新”。
我认为没有内置方法可以以此形式进行相同的操作。
dict1.update_partial(dict2, ('key1', 'key2', 'key3'))

你通常采取什么方法?你有自己的函数吗?它是什么样子的?

评论?


我已经向python-ideas提交了一个想法:

有时你需要一个字典是另一个字典的子集。如果dict.items接受可选的键列表来返回,那就太好了。如果没有给出键,则使用默认行为 - 获取所有项。

class NewDict(dict):

    def items(self, keys=()):
        """Another version of dict.items() which accepts specific keys to use."""
        for key in keys or self.keys():
            yield key, self[key]


a = NewDict({
    1: 'one',
    2: 'two',
    3: 'three',
    4: 'four',
    5: 'five'
})

print(dict(a.items()))
print(dict(a.items((1, 3, 5))))

vic@ubuntu:~/Desktop$ python test.py 
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}
{1: 'one', 3: 'three', 5: 'five'}

所以要使用另一个字典的一部分来更新字典,您需要使用以下代码:
dict1.update(dict2.items(['key1', 'key2', 'key3']))
4个回答

11

您可以这样做:

keys = ['key1', 'key2', 'key3']
dict1.update((k, dict2[k]) for k in keys)

1
我认为应该使用 dict1.update({k : dict2[k] for k in keys}) 进行更新(你需要用字典进行更新,而不是列表)。 - Guy Adini
@GuyAdini 在2.7版本中,你的代码也能正常工作。但在旧版本中,这个功能还不存在。aquavitae是完全正确的。 - glglgl
除非您需要支持Python 2.3,否则最好使用生成器推导式而不是列表推导式。dict1.update((k, dict2[k]) for k in keys) - Duncan

7

我不知道有没有内置函数,但这将是一个简单的两行代码:

for key in ('key1', 'key2', 'key3'):
    dict1[key] = dict2[key]  # assign dictionary items

我没有学到任何新东西 - 真的没有捷径... 我喜欢这个答案 - 它更明确。而且我认为它比aquavitae的答案更快,因为它不会创建任何中间列表或生成器。 - warvariuc

1
如果我们假设 dict2 中所有与 dict1 中键名相同的键值都应该被更新,那么最明确的方法可能是过滤 dict2 并使用过滤后的 dict1 更新 dict2。
dict1.update(
    {k: v for k, v in dict2.items() if k in dict1})

0
dict1.update([(key, dict2[key]) for key in dict2.keys()])

请解释一下这段代码的作用,并使用四个空格进行缩进,以使您的代码格式正确。 - agf

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