Python中类似javascript的arraymethod链接?

2024-09-21 11:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我是从javascript的背景来学习python的。在JS中,我们可以进行数组方法链接,这非常棒(尤其是使用arrow函数):

someArray
.filter(x => x.count > 10)
.sort((a, b) => a.count - b.count)
.map(x => x.name)

在python中是否可以实现类似数组方法的链接?如果不可能,那么为什么不能呢?在


Tags: 方法函数namemap链接countjs数组
3条回答

您可以进行方法链接,但内置list类型不支持作为方法请求的操作(例如map是一个内置)。@就你在例子中给出的操作而言,Felix的完美答案在我看来是正确的。如果你想链接方法,只需要每个方法返回一个实现下一个方法的对象。在

简单示例:

list("234").copy( # Copy once
  ).copy( # Twice
    ).append("Dog" # Returns None, so we can't continue chaining
      ).copy( # AttributeError because None has no method "copy"
        )

在Python中,可以执行以下操作:

from operator import attrgetter
map(lambda x: x.name, 
    sorted(filter(lambda x: x.count > 10, someArray), 
           key=attrgetter("count"))

语法稍有不同,但基本上应该是相同的。这能回答你的问题吗?在

编辑

如果您真的想要一个更像“链”的语法,可以看看^{}。从他们的docs

^{pr2}$

编辑2

感谢@mpium建议PyFunctional,它的语法似乎更酷:

from functional import seq

seq(1, 2, 3, 4)\
    .map(lambda x: x * 2)\
    .filter(lambda x: x > 4)\
    .reduce(lambda x, y: x + y)
# 14

在python中,您可以执行类似于数据管道的操作(这与方法链接正好相反…):

a1 = (item for item in someArray if item.count > 10)
a2 = sorted(a1, key=lambda x: x.count)
a3 = [item.name for item in a2]

注意,a1是一个生成器表达式(而不是list);它不存储元素,而是动态生成它们。在

当然,你可以把它们串在一起(这对我来说不太可读):

^{pr2}$

请注意,在python中,方法通常会更改实例(例如list.sort())以返回None。所以简单的方法链接对list不起作用。在

如果您使用一个为这些函数返回self的库,那么方法链接将起作用。在

相关问题 更多 >

    热门问题