Python 相当于 java-流管道
Python equivalent of java-streams piping
我主要在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)
这里我从一个文件中获取一个线列表,将每条线转换为一个 Angle 对象,通过一些参数过滤角度,然后创建一个对列表,最后找到最大对。此外可能还有多个附加操作,但关键是这是一个管道,将一个操作的输出传递给下一个操作。
我知道 python 列表理解,但它们似乎仅限于单个“映射”和单个“过滤器”。如果我需要使用 comprehension 传递多个映射,表达式很快就会变得复杂(我需要将一个理解放在另一个理解中)
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
我主要在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)
这里我从一个文件中获取一个线列表,将每条线转换为一个 Angle 对象,通过一些参数过滤角度,然后创建一个对列表,最后找到最大对。此外可能还有多个附加操作,但关键是这是一个管道,将一个操作的输出传递给下一个操作。
我知道 python 列表理解,但它们似乎仅限于单个“映射”和单个“过滤器”。如果我需要使用 comprehension 传递多个映射,表达式很快就会变得复杂(我需要将一个理解放在另一个理解中)
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