用函数和更新dict的pythonic方法
我有不同的字典,其中键是时间戳,值是接受所有一个输入参数的函数用函数和更新dict的pythonic方法,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有不同的字典,其中键是时间戳,值是接受所有一个输入参数的函数 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]: d
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>)])
我能想到的最简单的解决方案是使用dict理解处理重叠的键,然后用
dictionary2
更新dictionary
,然后更新重叠
要查找总数,请执行以下操作:
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
的值将丢失
你的求和方式可以说比我在这里提出的lambda加上两个额外参数更具python风格:
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)
你能告诉我们你做了些什么吗?你知道
dictionary.update(zip(dictionary2.keys(),dictionary2.values())
太过分了吗dictionary.update(dictionary2)
工作正常。您是否面临这样的情况:dictionary2
实际上是一个dict,或者您正在构建它,认为这样合并会更容易?@MadPhysician他们都是字典。您使用pandas也完全无关。如果你把钥匙做成字母之类的东西,你的例子会更简单、更一般。
dictionary.update(dictionary2)
dictionary.update(sums)