def zipWith(f,ls,xs): for i in range(len(ls)): yield f(ls[i],xs[i]) def all(f, ls): for x in ls: if not f(x): return False return True def splitWhen(f, ls): b, rs, xs = False, [], [] for x in ls: if f(x): b = True if b: xs += [x] else: rs += [x] return rs, xs def tail(ls): return list(ls)[1:] def take(n,ls): for x in ls: if n < 1: break yield x n -= 1 def drop(n,ls): for x in ls: if n < 1: yield x n -= 1 def splitAt(i, ls): ls = list(ls) return ls[:i], ls[i:] def partBy(n, ls): rs = [] while len(ls) >= n: xs, ls = splitAt(n,ls) rs.append(list(xs)) return rs def concat(ls): for xs in ls: for x in xs: yield x def dropWhile(f, ls): b = False for x in ls: if not b: if f(x): continue else: b = True if b: yield x def unfold(f, x): """ def f(x): if x > 0: return x, x-1 print(list(unfold(f, 5))) """ while True: r = f(x) if not r: break v, x = r yield v def nub(ls): rs = [] for x in ls: if x not in rs: rs.append(x) return rs def cartProd(ls, xs): for i in ls: for x in xs: if not i is x: yield i, x def numEqPrefix(ls, xs): acc = 0 for i in range(len(ls)): try: if ls[i] == xs[i]: acc += 1 except: break return acc def pairs2list(ls): rs = [] for a, b in ls: if not a in rs: rs.append(a) if not b in rs: rs.append(b) return rs