We have:
xs = ["A", "B", "C"]
ys = [1, 2, 3]
Let’s take a simple example: f repeats y times the char x  
f=lambda x,y:x*y
The computation of the matrix is obvious: for each y, we compute a row of f(x,y) with all x in xs.
matrix = [[f(x,y) for x in xs] for y in ys]
print ("matrix", matrix)
The display of the matrix is more interesting. First, we need to compute the width of each column.
The width of a column is the width of its widest element. If col is the column, the width is max(len(str(z)) for z in col).
The first column is the ys. To get the columns of the matrix, we just zip every row: zip(*matrix) is the same as zip(row[0], row[1], ...) 
ws = [max(len(str(y)) for y in ys)] + [max(len(str(y)) for y in col) for col in zip(*matrix)]
print ("ws", ws)
Now, we can print the matrix. The first row is [" "]+xs, the following rows are [y]+row where y is the label of the row. We get the labels and the rows with a new zip: zip(ys, matrix).
We have our rows, and we zip the values with the width of the columns (another zip! zip(zs, ws)) to adjust (ljust) the columns. The tab separates the columns:
for zs in ([" "]+xs, *[[y]+row for y, row in zip(ys, matrix)]): 
    print ("\t".join([str(z).ljust(w) for z,w in zip(zs, ws)]))
Output:
    A   B   C  
1   A   B   C  
2   AA  BB  CC 
3   AAA BBB CCC
1
solved Create matrix out of two lists while populating body of matrix using custom method in Python [closed]