from functools import reduce
from operator import mul
from itertools import takewhile
from math import sqrt, cos

reduce(mul, range(1,11),1)

def product(l):
    return reduce(mul, l, 1)

def f(n):
    return product(range(1, n+1))

f(10)

(lambda n : product(range(1, n+1)))(10)

def double(lst):
    return list(map(lambda x : 2*x, lst))

double([3,2,4]), double(range(1,9))

#or

def double(lst):
    return [2*x for x in lst]

lst = list(map(lambda x : x%3, range(5,11)))

#or

lst = [x%3 for x in range(5,11)]

max(lst), len(lst), sum(lst)

def countEven(lst):
    return sum(map(lambda x : 1 - x%2, lst))

countEven([3,2,4])

#or

def countEven(lst):
    return sum([1 - x%2 for x in lst])

def P(n):
    return n>1 and all(map(lambda k : n%k != 0, range(2,n)))

P(13), P(14)

def P(n):
    return n>1 and all([n%k for k in range(2,n)])


def P(n):
    return not any(map(lambda k : n%k == 0, range(2,n)))

P(13), P(14)

list(filter(lambda x : x%3 == 0, range(1,11)))

#or

[x for x in range(1,11) if x%3 == 0]

list(takewhile(lambda x : x%3 != 0, range(1,11)))

def avg(a): return sum(a)/len(a)

avg([1.0, 2.0, 3.0])

sum([sqrt(cos(k)) for k in range(1,11) if cos(k) > 0])

def add20(a):
    return list(map( lambda lst : list(map(lambda x : x + 20, lst)), a))

#or

def add20(a): return [[x + 20 for x in lst] for lst in a]

add20([[1], [2,3]])

def maxf(a, f):
    return f(max(a, key=f))

maxf([2, 3, 4, 5], lambda x : 60 / x)

def maxf2(a, f):
    return max(a, key=f)

maxf2([2, 3, 4, 5], lambda x : 60 / x)

tup = (1, "one", 0.5)

tup[1]

x, y, z = tup

y

tup = ((1, "one"), 0.5)

(x,y),z = tup

x, y, z

basket = [("apples", (3, 0.5)), ("pears", (2, 0.8)), ("lemons", (0, 1.0))]

[(fruit, count * unit_price) for fruit, (count, unit_price) in basket]

#megy ez Scala-ban is:
#for (fruit, (count, unit_price)) <- basket yield (fruit, count * unit_price)

basketDict = { fruit : unit_price for fruit, (count, unit_price) in basket }

basketDict["pears"]

# groupBy?

def biggerCount(lst):
    return sum([1 for x, y in zip(lst, lst[1:]) if x>y])

biggerCount([1,3,2,4,5,6,1])

# or, to make it look more like the Scala version

def mymap(fn, lst):
        return [fn(*i) for i in lst]    

def biggerCount(lst):
    return mymap(lambda x, y: x>y, zip(lst, lst[1:])).count(True)

biggerCount([1,3,2,4,5,6,1])

print(
list(filter(
    lambda k: len(
        list(filter(lambda j : j*j > 2*k,
               range(1, k+1))))
    >=3 , range(1,11))))



