如何在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()
答案 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())