在python中合并两个字典视图

时间:2019-02-25 14:52:13

标签: python dictionary merge

如何在python中合并两个字典的项目的视图

我的用例是:我在一个类中有两个私人词典。我希望API将它们视为一个,并提供一种items方法。我知道的唯一方法是将它们结合起来,然后对两者进行介绍,但是对于大型词典来说,这似乎很昂贵。我在想像a.items() + b.items()

注意:我不在乎按键冲突。

这是我要改进的地方:

class A:
    _priv1 = {'a': 1, 'b': 2}
    _priv2 = {'c': 1, 'd': 2}

    def items(self):
        return {**self._priv1, **self._priv2}.items()

4 个答案:

答案 0 :(得分:1)

合并词典的视图没有任何意义,因为视图总是反映相应字典的内容。

因此,要获得不同的视图,要么编辑一个字典,要么实例化一个新的字典(就像您所做的那样),就无法解决它。参见this

但是也许您想要的是itertools.chain遍历多个可迭代对象。这个解决方案不是令人满意的。或正如其他人所说的collections.ChainMap。我将使用chain进行迭代,并使用ChainMap进行查找。

答案 1 :(得分:1)

您可以使用ChainMap

  

ChainMap将多个字典或其他映射组合在一起,以创建一个可更新的视图。如果未指定任何映射,则会提供一个空字典,以便新链始终至少具有一个映射。

function test_func () {
echo json_encode(array('res'=>'return dummy text'));
wp_die();
}
add_action('wp_ajax_nopriv_test_func', 'test_func'); // ajax call for non-login user.
add_action('wp_ajax_test_func', 'test_func'); // ajax call for login user.

示例:

from collections import ChainMap
context = ChainMap(_priv1, _priv2, ...)

对于您的代码示例,我将使用:

In [3]: _priv1 = {1: 2, 3: 4}

In [4]: _priv2 = {5: 6, 7: 8}

In [5]: from collections import ChainMap
   ...: context = ChainMap(_priv1, _priv2)

In [6]: context
Out[6]: ChainMap({1: 2, 3: 4}, {5: 6, 7: 8})

In [7]: _priv1.update({9: 10})

In [8]: context
Out[8]: ChainMap({1: 2, 3: 4, 9: 10}, {5: 6, 7: 8})

In [9]: context.get(9)
Out[9]: 10

答案 2 :(得分:1)

您可以使用having

ChainMap

答案 3 :(得分:0)

您可以使用chain两个结合两个或更多视图。如所述:

  

创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行到下一个可迭代对象,直到所有可迭代对象都耗尽为止。

那样就不会复制数据。

from itertools import chain

class A:
    _priv1 = {'a': 1, 'b': 2}
    _priv2 = {'c': 1, 'd': 2}

    def items(self):
        return chain(self._priv1.items(), self._priv2.items())