RosettaCodeData/Task/Kronecker-product/Python/kronecker-product-3.py

47 lines
914 B
Python

from itertools import (chain)
# kronecker :: [[a]] -> [[a]] -> [[a]]
def kronecker(m1, m2):
return concatMap(
lambda row2: concatMap(
lambda elem2: [concatMap(
lambda num2: concatMap(
lambda num1: [num1 * num2],
elem2
),
m1[row2]
)],
m2
),
range(len(m2))
)
# concatMap :: (a -> [b]) -> [a] -> [b]
def concatMap(f, xs):
return list(
chain.from_iterable(
map(f, xs)
)
)
if __name__ == '__main__':
# Sample 1
r = [[1, 2], [3, 4]]
s = [[0, 5], [6, 7]]
# Sample 2
t = [[0, 1, 0], [1, 1, 1], [0, 1, 0]]
u = [[1, 1, 1, 1], [1, 0, 0, 1], [1, 1, 1, 1]]
# Result 1:
for row in kronecker(r, s):
print(row)
print()
# Result 2
for row in kronecker(t, u):
print(row)