输入:两个函数 f 和 g,表示为字典,使得 g ◦ f 存在。输出:表示函数 g ◦ f 的字典。 示例:给定 f = {0:'a', 1:'b'} 和 g = {'a':'apple', 'b':'banana'},返回 {0:'apple', 1:'香蕉'}。
我得到的最接近正确答案的是 {i:g[j] for i in f for j in g},它输出 {0: 'apple', 1: 'apple'}。我做错了什么?
最佳答案
其他答案很好,但它们创建的整个字典可能很慢。如果你只想要一个只读的组合,那么下面的类将解决你的问题:
class Composition_mapping(collections.abc.Mapping):
def __init__(self, f, g):
self.f = f
self.g = g
def __iter__(self):
return iter(self.g)
def __len__(self):
return len(self.g)
def keys(self):
return self.g.keys()
def __getitem__(self, item):
return self.f[self.g[item]]
例如:
a = {1: 5}
b = {5:9, 7 : 8}
c = Composition_mapping(b,a)
print(c[1])
>>> 9
如果你决定让它成为一个口述,你总是可以这样做:
c = dict(c)
print(c)
>>> {1: 9}
这是安全的,因为 Composition_mapping 满足 the mapping protocol ,这意味着它被认为是一个映射。映射是只读类字典结构的接口(interface)(协议(protocol))。注意不需要继承collections.abc.Mapping,只需要实现方法__getitem__, __iter__, __len__ __contains__, keys, items, values, get, __eq__, and __ne__
即可映射;毕竟 Python 偏爱鸭子类型。我的代码继承自 collections.abc.Mapping 的原因是它为您实现了除 __getitem__, __iter__, __len__
之外的所有其他方法。参见 the official documentation有关协议(protocol)的详细信息。
无论组合函数有多大,使用此方法创建组合的时间成本都是恒定的。由于双重查找和额外的函数调用,查找可能会稍微慢一点,但是如果您要在一个性能关键部分。更重要的是,如果您在代码中的任何地方更改 a 和 b,这些更改将反射(reflect)在 c 上。
关于python - 坚持在 python 中定义组合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39756890/