Вы можете использовать списочные выражения:
X = [1,2,3]
Y = [4,5,6,7]
Используйте itertools.product
в понимании списка, чтобы получить декартово произведение двух списков, сохраняя указанную структуру вложенного списка:
Z = [list(product([x],Y)) for x in X]
#[[(1, 4), (1, 5), (1, 6), (1, 7)],
# [(2, 4), (2, 5), (2, 6), (2, 7)],
# [(3, 4), (3, 5), (3, 6), (3, 7)]]
И использовать сжатие вложенного списка, чтобы применить функцию, сохраняющую структуру:
[[x*y for x,y in z] for z in Z]
#[[4, 5, 6, 7], [8, 10, 12, 14], [12, 15, 18, 21]]