用函数和更新dict的pythonic方法

2024-06-26 01:58:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有不同的字典,其中键是时间戳,值是接受所有一个输入参数的函数

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>)])

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

  1. 有没有其他方法来定义函数和,而不是:

    In [180]: def H(f, g):
         ...:     def _h(x):
         ...:         return f(x) + g(x)
         ...:     return _h
         ...: 
    
    In [181]: 
    
  2. 我该如何以一种类似于Python的方式更新dict


Tags: 函数indictionary字典maindeffunctionpass
1条回答
网友
1楼 · 发布于 2024-06-26 01:58:10

我能想到的最简单的解决方案是使用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的值在理解的每次迭代中立即绑定。如果我在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)

相关问题 更多 >