gpt4 book ai didi

python - python中有map的运算符形式吗?

转载 作者:行者123 更新时间:2023-12-01 03:39:53 25 4
gpt4 key购买 nike

在 Mathematica 中,可以将 Map[f,list] 写为 f/@list,其中/@ 是 Map 的运算符形式。在 python 中,有 map(f, list) 但是否有类似的运算符形式或提供此功能的包?

应用程序是使用许多映射的深度嵌套转换最终会产生大量括号,而运算符链接可以更容易阅读(和输入)。

最佳答案

没有简单的方法可以做到这一点。 Python 不提供任何定义自定义运算符的方法,并且它提供的运算符集非常标准,主要用于数字和字符串等内容。 map 对象不支持类似的东西,但是没有什么可以阻止您编写自己的类:

class Mapper:
def __init__(self, f):
self.f = f
def __matmul__(self, other):
return map(self.f, other)

用作:

In [3]: list(Mapper(lambda x: x+1) @ [1,2,3,4,5])
Out[3]: [2, 3, 4, 5, 6]

您可以类似地引入一个 Filter 类:

class Filter:
def __init__(self, p):
self.p = p
def __matmul__(self, other):
return filter(self.p, other)

用作:

In [5]: list(Filter(lambda x: x%2==0) @ range(10))
Out[5]: [0, 2, 4, 6, 8]

事实上,您可以看到此类类几乎都是相同的,因此您可以对它们进行概括。

<小时/>

注意:@ 作为运算符是 python3.5 中新增的操作符。

<小时/>

使用此函数的一个问题是 @关联的,这意味着您无法组合此函数。您可以使用像 ** 这样的右关联的东西来轻松组合它们:

class Filter:
def __init__(self, p):
self.p = p
def __pow__(self, other):
return filter(self.p, other)

class Mapper:
def __init__(self, f):
self.f = f
def __pow__(self, other):
return map(self.f, other)

允许:

In [13]: Filter(lambda x: x%2==0) ** Mapper(lambda x: x+1) ** range(10)
Out[13]: <filter at 0x7fe0696bcd68>
<小时/>

为了完整起见:这是一个概括了这个概念的实现,并且还通过组合转换与 @ 一起使用:

class Apply:
def __init__(self, f):
self.f = f
def __matmul__(self, seq_or_apply):
if isinstance(seq_or_apply, Apply):
return Apply(lambda seq: self.f(seq_or_apply.f(seq)))
return self.f(seq_or_apply)

class Mapper(Apply):
def __init__(self, f):
super().__init__(lambda x: map(f, x))

class Filter(Apply):
def __init__(self, p):
super().__init__(lambda x: filter(p, x))

from functools import reduce

class Reduce(Apply):
def __init__(self, op, init):
super().__init__(lambda seq: reduce(op, seq, init))

用作:

In [26]: import operator as op
In [27]: Reduce(op.add, -7) @ Filter(lambda x: x%2==0) @ Mapper(lambda x: x+1) @ range(10)
Out[27]: 23

关于python - python中有map的运算符形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39770352/

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