Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用函数和更新dict的pythonic方法_Python_Python 2.7_Dictionary - Fatal编程技术网

用函数和更新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>)])
  • 如何以一种类似于Python的方式更新dict


  • 我能想到的最简单的解决方案是使用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)