gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:41:41 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com