func.py/func_py/list.py
2025-06-15 22:39:15 +02:00

112 lines
1.7 KiB
Python

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