有人知道我会在Python中以Java流API的方式编写序列处理吗?想法是按照操作发生的顺序编写操作:
myList.stream()
.filter(condition)
.map(action1)
.map(action2)
.collect(Collectors.toList());
现在可以在python中做
[action2(action1(item)) for item in my_list if condition(item)]
但这是相反的顺序。
我怎么能以正确的顺序买东西?显然我可以使用变量,但随后我必须为每个部分结果找到一个名称。
答案 0 :(得分:3)
您可以自己编写:
from collections import UserList
class JavaLike(UserList):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.iter = None
def stream(self):
self.iter = None
return self
def filter(self, function):
self.iter = filter(function, self if self.iter is None else self.iter)
return self
def map(self, function):
self.iter = map(function, self if self.iter is None else self.iter)
return self
def collect(self, collection_class=None):
if collection_class is None:
if self.iter is not None:
ret = JavaLike(self.iter)
self.iter = None
return ret
return JavaLike(self)
return collection_class(self if self.iter is None else self.iter)
然后可能会有类似的语法:
>>> JavaLike(range(10)).stream().filter(lambda x: x % 2 == 0).map(str).collect(tuple)
('0', '2', '4', '6', '8')
答案 1 :(得分:1)
已经有一个库可以完全满足您的需求,即懒惰求值和操作顺序与编写方式相同,还有其他许多好东西,例如多进程或多线程Map / Reduce。
它的名称为pyxtension
,并且已经准备好并在PyPi上进行维护。
您的代码将以以下形式重写:
buffered
和
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
let file_path = "input.txt";
let input = File::open(file_path)?;
let buffered = BufReader::new(input);
let line_count = buffered.lines().count();
let input = File::open(file_path)?;
let buffered = BufReader::new(input);
for (nr, line) in buffered.lines().enumerate() {
println!("LOADED: [{}/{}]", nr, line_count);
}
Ok(())
}
请注意,最后一条语句from pyxtension.strams import stream
stream(myList)
.filter(condition)
.map(action1)
.map(action2)
.toList()
符合您的期望-收集的数据与Spark RDD中发生的情况相同。
答案 2 :(得分:0)
PyPI上至少有两个模块:lazy-streams和pystreams