我想要一个实现 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 习惯用法可以避免实现 [class with a intersection_update
] 方法的需要?”,但我几乎立即删除了它,因为经过进一步思考,我意识到这是对弱答案的邀请,因为我对 Python 语言的“核心”了解得足够多,可以肯定不存在这样的习语,至少不存在可以匹配的习语专用方法的优点(通用性、易读性、易于打字)。
最佳答案
这是一个伪代码,您可以将其与现有的更新功能一起使用,但是如果您想扩展字典,那么您的代码片段也是有效的 - 但是在任何地方使用您的 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 的评论更新代码
关于python - 听写的 intersection_update?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624432/