Python 相当于 java-streams 管道

问题描述 投票:0回答:2

我主要用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 中是否有一种语法结构允许在一个命令中添加多个操作?

python java-stream pipe list-comprehension
2个回答
5
投票

自己实现并不难,例如:

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

0
投票

我想提一下我编写的

streamable
模块(很想得到反馈!):

你的例子看起来像:

from streamable import Stream

path: str = ...

class Angle:
    def __init__(self, line: str): ...

def foo(line: str) -> bool: ...

def cosine(angle: Angle) -> float: ...

key, value = max(
    Stream(lambda: open(path, "r"))
    .map(Angle)
    .filter(foo)
    .map(lambda angle: (angle, cosine(angle))),
    key=lambda pair: pair[1]
)
  • 这是一个类型化模块,具有 100% 代码覆盖率且无依赖性
  • Stream[T]
    课程扩展
    Iterable[T]
  • 流是不可变的
  • 操作是惰性评估的,涵盖并发、分组/扁平化、异常捕获、速率限制、迭代进度日志记录……
© www.soinside.com 2019 - 2024. All rights reserved.