合并字典,保留旧键和新值

斯科特·科尔比(Scott Colby)

我正在写一个解析RSS feed的Python脚本。我想维护源中定期更新的条目字典。Feed中不再存在的条目应被删除,新条目应获得默认值,以前看到的条目的值应保持不变。

我认为这是最好的例子,我认为:

>>> old = {
...     'a': 1,
...     'b': 2,
...     'c': 3
... }
>>> new = {
...     'c': 'x',
...     'd': 'y',
...     'e': 'z'
... }
>>> out = some_function(old, new)
>>> out
{'c': 3, 'd': 'y', 'e': 'z'}

这是我目前的尝试:

def merge_preserving_old_values_and_new_keys(old, new):
       out = {}
       for k, v in new.items():
           out[k] = v
       for k, v in old.items():
           if k in out:
               out[k] = v
       return out

这行得通,但是在我看来,可能会有更好或更聪明的方法。

编辑:如果您想测试您的功能:

def my_merge(old, new):
    pass

old = {'a': 1, 'b': 2, 'c': 3}
new = {'c': 'x', 'd': 'y', 'e': 'z'}

out = my_merge(old, new)
assert out == {'c': 3, 'd': 'y', 'e': 'z'}

编辑2:将Martijn Pieters的答案定义为set_merge,bravosierra99的定义为loop_merge,而我的首次尝试是orig_merge,则得到以下计时结果:

>>> setup="""
... old = {'a': 1, 'b': 2, 'c': 3}
... new = {'c': 'x', 'd': 'y', 'e': 'z'}
... from __main__ import set_merge, loop_merge, orig_merge
... """
>>> timeit.timeit('set_merge(old, new)', setup=setup)
3.4415210600000137
>>> timeit.timeit('loop_merge(old, new)', setup=setup)
1.161155690000669
>>> timeit.timeit('orig_merge(old, new)', setup=setup)
1.1776735319999716

我发现这很令人惊讶,因为我没想到字典视图方法会这么慢。

马丁·彼得斯(Martijn Pieters)

字典具有充当集合的字典视图对象使用这些来获得新旧之间的交集:

def merge_preserving_old_values_and_new_keys(old, new):
    result = new.copy()
    result.update((k, old[k]) for k in old.viewkeys() & new.viewkeys())
    return result

上面使用了Python 2语法;使用old.keys() & new.keys()如果你正在使用Python 3,对于相同的结果:

def merge_preserving_old_values_and_new_keys(old, new):
    # Python 3 version
    result = new.copy()
    result.update((k, old[k]) for k in old.keys() & new.keys())
    return result

上面的代码以所有键值对new为起点,然后将old两个键值对中出现的任何键的值相加

演示:

>>> merge_preserving_old_values_and_new_keys(old, new)
{'c': 3, 'e': 'z', 'd': 'y'}

请注意,该函数与您的版本一样,会产生一个新的字典(尽管键和值对象是共享的;它是一个浅表副本)。

如果您不需要其他任何新字典,也可以就地更新新字典:

def merge_preserving_old_values_and_new_keys(old, new):
    new.update((k, old[k]) for k in old.viewkeys() & new.viewkeys())
    return new

您还可以使用单线dict理解来构建新词典:

def merge_preserving_old_values_and_new_keys(old, new):
    return {k: old[k] if k in old else v for k, v in new.items()}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并字典,保留旧键和新值

来自分类Dev

向旧字典添加新键和值而不更改旧字典的键?

来自分类Dev

合并两个 python 字典并在新的更新字典中保留最大键 val

来自分类Dev

如何合并到对象并将空值替换为新值,如果新值为空,则保留旧值

来自分类Dev

字典键重复。合并字典值

来自分类Dev

熊猫-将字典键和值映射到新列

来自分类Dev

字典和嵌套字典之间的Python键匹配,并将新值写入嵌套字典

来自分类Dev

GWTP Presenter 和 View 保留旧值

来自分类常见问题

如何合并数组和保留键?

来自分类Dev

如果值相同,则合并字典键

来自分类Dev

在字典列表中合并相同键的值

来自分类Dev

嵌套字典键和值

来自分类Dev

如何在python循环中向字典添加新的键和值,字典是类对象的属性

来自分类Dev

匹配来自两个不同字典的键和值并将其合并

来自分类Dev

添加新的键和值时,字典值将被覆盖

来自分类Dev

合并两个字典的最佳方法,合并第一和第二个键的值

来自分类Dev

$_SESSION 保留旧值

来自分类Dev

清除字典但保留键

来自分类Dev

如何将值列表和新键添加到嵌套字典中?

来自分类Dev

在 Python 字典中保留不同值的最小键

来自分类Dev

通过索引/键合并数组,保留所有值

来自分类Dev

通过索引/键合并数组,保留所有值

来自分类Dev

通过键合并字典

来自分类Dev

通过键合并字典

来自分类Dev

连接字典中的键和值

来自分类Dev

在字典中分配嵌套键和值

来自分类Dev

反向键和字典中的值

来自分类Dev

从字典中打印键和值

来自分类Dev

反复向字典添加键和值