用函数求和更新dict的pythonic方法

时间:2018-02-14 07:01:17

标签: python python-2.7 dictionary

我有不同的词典,其中键是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>)])

然而,我想要的是我们得到一个新函数(名称无关紧要),在这种情况下,它是gl的总和。有两个问题:

  1. 是否有另一种定义函数总和的方法:

    In [180]: def H(f, g):
         ...:     def _h(x):
         ...:         return f(x) + g(x)
         ...:     return _h
         ...: 
    
    In [181]: 
    
  2. 如何以pythonic方式更新dict。

1 个答案:

答案 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)