编写函数组合程序的更优雅方法?

时间:2018-08-14 06:48:22

标签: python python-3.x

我试图解决以下问题:

  

my_function_composition(f,g)

     

输入:两个函数f和g,用字典表示,因此存在g◦f。

     

输出:代表函数g◦f的字典。

     

示例:给定f = {0:'a',1:'b'}和g = {'a':'apple','b':'banana'},返回{0:'apple', 1:“香蕉”}。


我找到了一个解决方案,但对我来说却很混乱:

def my_function_composition(f,g): return {list(f.keys())[i]: list(g.values())[i] for i in f if list(f.values()) == list(g.keys())}

# example/test
w = {0:'a', 1:'b', 2: 'c'}
v = {'a': 'apple', 'b':'banana', 'c': 'carrot'}

my_function_composition(w,v)

根据这本书,下一节将介绍循环问题,因此,我认为对此有一个优雅的单行解决方案。

注意:非常感谢您能为您的解决方案提供评论,因为我是python的新手

2 个答案:

答案 0 :(得分:2)

您可以使用dict理解:

d = {k: g[v] for k, v in f.items()}

d变为:

{0: 'apple', 1: 'banana'}

答案 1 :(得分:1)

我会这样:

return {fk:g[fv] for fk, fv in f.items() if fv in g}

fkf中的键,而fvf中键的值。

我要做的是创建一个字典,其中的键由f的键组成,值由在f中查找g的值组成(如果它们存在)。

我只是想做个书呆子,所以添加了if fv in g,我认为这不是本练习的必要条件。

示例:

>>> def fcomp(f, g): return {fk:g[fv] for fk, fv in f.items() if fv in g}
... 
>>> fcomp({0:'a', 1:'b', 2: 'c'}, {'a': 'apple', 'b':'banana', 'c': 'carrot'})
{0: 'apple', 1: 'banana', 2: 'carrot'}
>>>