我有不同的字典,其中键是时间戳,值是接受所有一个输入参数的函数
In [172]: from collections import OrderedDict
In [173]: import pandas as pd
In [174]: def f(x):
...: pass
...: def g(x):
...: pass
...: def h(x):
...: pass
...:
In [175]: dictionary = OrderedDict(zip(keys, [f, g, h]))
In [176]: def l(x):
...: pass
...:
In [177]: dictionary2 = OrderedDict(zip(pd.date_range('20190101', '20200101', freq='BA'), [l]))
现在我想用dictionary2
更新dictionary
,如果它们共享密钥,那么更新后的字典应该包含一个函数,它是其他字典的总和。如果我做一个简单的更新,它就会覆盖它:
In [178]: dictionary.update(zip(dictionary2.keys(), dictionary2.values()))
In [179]: dictionary
Out[179]:
OrderedDict([(Timestamp('2018-12-31 00:00:00', freq='BA-DEC'),
<function __main__.f>),
(Timestamp('2019-12-31 00:00:00', freq='BA-DEC'),
<function __main__.l>),
(Timestamp('2020-12-31 00:00:00', freq='BA-DEC'),
<function __main__.h>)])
然而,我想要的是我们得到一个新函数(名称无关紧要),它是g
和l
的和。有两个问题:
有没有其他方法来定义函数和,而不是:
In [180]: def H(f, g):
...: def _h(x):
...: return f(x) + g(x)
...: return _h
...:
In [181]:
我该如何以一种类似于Python的方式更新dict
我能想到的最简单的解决方案是使用dict理解处理重叠的键,然后用
dictionary2
更新dictionary
,然后再更新重叠求和:
lambda应该可以,因为您显式地声明函数的名称是不相关的。我做了一点小欺骗,使用lambda的默认参数提前提取字典值,lambda的值在理解的每次迭代中立即绑定。如果我在lambda中执行了
dictionary[k](x) + dictionary2[k](x)
,那么函数将仅在调用lambda时绑定,此时来自dictionary
的值将丢失你的求和方式可以说比我在这里提出的,带有两个附加参数的lambda更具python风格:
要更新:
相关问题 更多 >
编程相关推荐