intersection_update for dicts?

时间:2012-09-27 15:03:58

标签: python dictionary intersection

我想要一个实现intersection_update方法的字典类,其精神与dict.update类似,但仅将更新限制为调用实例中已存在的那些键(参见下面的一些示例实现) )。

但是,根据Wheel Reinvention Avoidance的精神,在我开始实现(以及编写测试等)具有此附加功能的映射类之前,这样的任何事情都已经存在于一个或多或少的标准模块中?


要清楚,我想到的intersection_update方法会做到这样的事情:

def intersection_update(self, other):
    for k in self.viewkeys() & other.viewkeys():
        self[k] = other[k]

......虽然实际的实现可能会尝试一些可能的优化,例如:

def intersection_update(self, other):
    x, y = (self, other) if len(self) < len(other) else (other, self)
    for k in x.iterkeys():
        if k in y:
            self[k] = other[k]

编辑:在这篇文章的原始版本中,我曾写过“或者,是否有一个标准的Python成语,不需要实现[带有intersection_update]方法的类?”,但我几乎立即删除了因为经过进一步的反思,我意识到这是一个弱回答的邀请,因为我已经足够了解Python语言的“核心”,以确定不存在这样的习语,至少没有一个能够与这些优点相匹配(一般性,易读性,易于打字的专用方法。

2 个答案:

答案 0 :(得分:2)

这是一个伪代码,您可以将其与现有的更新函数一起使用,但是如果您想扩展字典,那么您的代码片段也是有效的 - 但这会增加一些额外的麻烦,即在任何地方使用您的dict类。

In [1]: x = dict(name='abc', age=23)

In [2]: y = dict(name='xyz', notes='Note 123', section=None)

In [3]: #x.update(dict((k,y[k]) for k in y if k in x))

In [3]: x.update((k,v) for k,v in y.iteritems() if k in x)

In [4]: x
Out[4]: {'age': 23, 'name': 'xyz'}

编辑:使用iteritems方法根据kjo的评论更新代码

答案 1 :(得分:1)

试试这个:

def dict_intersection(d1, d2):
    return dict((key, d2[key] or d1[key]) for key in frozenset(d1) & frozenset(d2))

或者,对于python版本&gt; = 2.7:

def dict_intersection(d1, d2):
    return {key: d2[key] or d1[key] for key in d1.viewkeys() & d2.viewkeys()}