python - 坚持在 python 中定义组合函数

标签 python composition

输入:两个函数 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/

相关文章:

python - DataTables 服务器端处理 - 回显 draw() 参数 (Python/Flask)

java - Java 伪代码中所附 UML 图的解释?

go - 如何检查具体类型由哪些嵌入类型组成?

oop - 当特征需要的状态多于结构中包含的状态时,如何为结构实现特征?

python - 如何在discord.py中制作计时器命令?

python - 加载 csv 文件时出现内存错误?

python - PILL 图像从 base64 转换后的图像中检索 exif dict 进行编辑并保存错误,dict 返回为 NULL,有什么想法吗?

python - 从多个 Excel 文件和工作表中具有相同名称的特定列中提取数据

javascript - react .js : Wrapping one component into another

c++ - 通过更改推导的模板值自组合函数