Python等价于java-streams管道



我主要用Java编程,我发现对于数据分析,python更方便。我正在寻找一种方式来管道操作的方式,相当于java流。例如,我想做这样的事情(我正在混合java和python语法)。

(key, value) = Files.lines(Paths.get(path))
.map(line -> new Angle(line))
.filter(angle -> foo(angle))
.map(angle -> (angle, cosine(angle)))
.max(Comparator.comparing(Pair::getValue)

这里我从文件中获取行列表,将每一行转换为一个角度对象,通过一些参数过滤角度,然后创建一对列表并最终找到最大的一对。可能还有多个额外的操作,但关键是这是一个管道,将一个操作的输出传递到下一个操作。

我知道python的列表推导式,但是它们似乎仅限于单个"映射"。和一个"过滤器"。如果我需要使用推导式来管道多个映射,表达式很快就会变得复杂(我需要将一个推导式放入另一个推导式中)

在python中是否存在允许在一个命令中添加多个操作的语法结构?

自己实现并不难,例如:

class BasePipe:
def __init__(self, data):
self.data = data

def filter(self, f):
self.data = [d for d in self.data if f(d)]
return self

def map(self, f):
self.data = [*map(f, self.data)]
return self

def __iter__(self):
yield from self.data

def __str__(self):
return str(self.data)

def max(self):
return max(self.data)
def min(self):
return min(self.data)
value = (
BasePipe([1, 2, 3, 4]).
map(lambda x: x * 2).
filter(lambda x: x > 4).
max()
)

并给出:

8

不幸的是,Python中没有内置流,但如果你想构建流管道,你可以使用PyStreamAPI。PyStreamAPI支持并行和顺序流。

下面是使用PyStreamAPI重写的代码:

from pystreamapi import Stream
with open("file.txt") as f:
angle, cos = Stream.of(f.readlines()) 
.map(lambda l: Angle(l))
.filter(lambda a: foo(a))
.map(lambda a: (a, cosine(a)))
.sorted(lambda a: Pair.getValue(a))
.max()

你可以在GitHub上看到完整的文档:https://github.com/PickwickSoft/pystreamapi

最新更新