合并Python中的两个字典视图

3
如何在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个回答

2
你可以使用ChainMap
from collections import ChainMap

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

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

1
你可以使用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())

1
合并字典视图没有意义,因为视图总是反映相应字典的内容。因此,要获得不同的视图,要么编辑其中一个字典,要么实例化一个新字典(就像您所做的那样),这是无法避免的。请参见this
但也许您想要的是itertools.chain来迭代多个可迭代对象。这种解决方案不会实例化。或者像其他人所说的collections.ChainMap。我会使用chain进行迭代,使用ChainMap进行查找。

1
你可以使用 ChainMap

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

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

对于你的代码示例,我会使用:

from collections import ChainMap

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

    @classmethod
    def items(cls):
        return cls._union_dict.items()

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