我有不同的词典,其中键是pandas timestamp,值是函数,它接受所有一个输入参数。
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]))
现在我想用dictionary
更新dictionary2
,如果他们共享密钥,更新的字典应该保存一个函数,该函数是其他函数的总和。如果我做一个简单的更新,它只会覆盖它:
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]:
如何以pythonic方式更新dict。
答案 0 :(得分:1)
我能想到的最简单的解决方案是使用字典理解来处理重叠的键,然后使用dictionary
更新dictionary2
,然后重叠。
要查找总和:
sums = {k: lambda x, f1=dictionary[k], f2=dictionary2[k]: f1(x) + f2(x) for k in dictionary2 if k in dictionary}
lambda应该没问题,因为你明确声明函数的名称是无关紧要的。我稍微作弊并使用lambda的默认参数预先提取字典值,其值在每次理解迭代中立即绑定。如果我在lambda中完成了dictionary[k](x) + dictionary2[k](x)
,那么函数只会在调用lambda时绑定,此时dictionary
的值将会丢失。
你做这笔钱的方式可能比我在这里提出的更具Pythonic的lambth有两个额外的参数:
def s(f, g):
def h(x): return f(x) + g(x)
return h
sums = {k: s(dictionary[k], dictionary2[k]) for k in dictionary2 if k in dictionary}
更新:
dictionary.update(dictionary2)
dictionary.update(sums)