我有两个列表,我想用它来制作2D矩阵。我想基于两个列表的组合调用自定义方法来填充矩阵的主体。
我该怎么做?
假设我有一个[A,B,C]和[1,2,3]列表。我想要的结果是:
A B C
1 x
2
3
其中x是my_method(A,1)的返回值。
谢谢。
我们有:
xs = ["A", "B", "C"]
ys = [1, 2, 3]
让我们举一个简单的例子:f
重复y
次char charzxswpoi
x
矩阵的计算是显而易见的:对于每个f=lambda x,y:x*y
,我们计算一行y
与f(x,y)
中的所有x
。
xs
矩阵的显示更有趣。首先,我们需要计算每列的宽度。列的宽度是其最宽元素的宽度。如果matrix = [[f(x,y) for x in xs] for y in ys]
print ("matrix", matrix)
是列,则宽度为col
。第一列是max(len(str(z)) for z in col)
。要获取矩阵的列,我们只需压缩每一行:ys
与zip(*matrix)
相同
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)
,以下行是[" "]+xs
,其中[y]+row
是行的标签。我们用新的y
:zip
获取标签和行。我们有行,我们用列的宽度(另一个zip(ys, matrix)
!zip
)压缩值来调整(zip(zs, ws)
)列。选项卡分隔列:
ljust
输出:
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)]))
A B C
1 A B C
2 AA BB CC
3 AAA BBB CCC
试试这个:
Try it online!