I realized python has worse generators syntax than javascript/rust/haskell:
instead of something like
my_iterator.filter(cond).map(convert_fn).collect()
in python you have to write
list(map(convert_fn, filter(cond, my_iterator)))
so everything is backwards and much harder to read. As far as I know there is no direct way that would allow one to write that in straight-forward manner.
Hence I made a small python library that fixes that.
It just introduces the Iter
class that you can wrap around an iterator and use the chained dot notation, like so:
Iter(my_iterator).filter(cond).map(convert_fn).collect()
I also added first
and drop
functions, just because they also seem somewhat useful.
The code is quite short, so here you go, maybe you will also find it useful:
import functools
def first(n, it):
for i, x in enumerate(it):
if i == n:
raise StopIteration
yield x
def drop(n, it):
for i, x in enumerate(it):
if i == n-1:
break
return it
class Iter:
def __init__(self, iterable):
self.it = iter(iterable)
def __iter__(self):
return self.it
def __next__(self):
return next(self.it)
def next(self):
return next(self)
def map(self, f):
return Iter(map(f, self))
def filter(self, cond):
return Iter(filter(cond, self))
def reduce(self, f):
return functools.reduce(f, self)
def drop(self, n):
return Iter(drop(n, self))
def first(self, n):
return Iter(first(n,self))
def collect(self):
return list(self)
Top comments (0)