使用列表理解的矩阵操作

时间:2014-12-14 20:59:12

标签: python list matrix

我的任务是编写一个Python脚本来将相等大小的多维矩阵添加到一起并返回结果。例如,[[3, 6, 7], [2, 7, -4], [0, 1, 0]][[1, 0, 0], [-2, 1, 0], [-1, 1, 3]]应返回[[4, 6, 7], [0, 8, -4], [-1, 2, 3]]

我这样写了它并且工作正常:

def addition(a, b):
    if len(a) == len(b):
        c = [[] for i in range(len(a))]
        for i in range(len(a)):
            for j in range(len(a[i])):
                c[i].append(a[i][j] + b[i][j])
        return c
    else:
        print('error')

接下来我想知道是否有可能使用列表理解更简洁地重写这个,这是我的第一次尝试:

def addition(a, b):
    return [[a[i][j] + b[i][j]] for i in range(len(a)) for j in range(len(a[i]))]

但是,使用ab的相同值,我得到以下结果:

>>> a = [[3, 6, 7], [2, 7, -4], [0, 1, 0]]
>>> b = [[1, 0, 0], [-2, 1, 0], [-1, 1, 3]]
>>> addition(a, b)
[[4], [6], [7], [0], [8], [-4], [-1], [2], [3]]

2 个答案:

答案 0 :(得分:4)

当您要进行这样的元素操作时,您可以使用zip按顺序操作列表。

def addition(a,b):
    return [[i+j for i,j in zip(sub1, sub2)] for sub1, sub2 in zip(a, b)]

>>> l1 = [[3, 6, 7], [2, 7, -4], [0, 1, 0]]
>>> l2 = [[1, 0, 0], [-2, 1, 0], [-1, 1, 3]]

>>> addition(l1, l2)
[[4, 6, 7], [0, 8, -4], [-1, 2, 3]]

答案 1 :(得分:3)

如果你稍微移动括号和索引,你可以得到你想要的东西:

def addition(a,b):
    return [[a[i][j]+b[i][j] for j in range(len(a[i]))] for i in range(len(a))]

(或者你可以使用zip,正如Cyber​​建议的那样。)