按列表列表乘以列表列表

时间:2014-11-18 19:42:49

标签: python list multiplication nested-lists

有谁知道如何按列表列表列出列表清单?

[[0], [0], [12, 8, 0]]

[[1], [10], [1, 100, 1]

预期结果[[0],[0], [12,800, 0]].

当我尝试时,我总是得到:

  

TypeError:不能将序列乘以类型'列表的非int。

4 个答案:

答案 0 :(得分:3)

lst1 = [[0], [1,2]]
lst2 = [[1], [2,2]]
r = [a*b for x,y in zip(lst1,lst2) for a,b in zip(x,y)]

print r

输出:

[0, 2, 4]

在此示例中,它起作用,因为lst1lst2具有相同数量的子列表,这些子列表也具有相同数量的整数项。

答案 1 :(得分:1)

另一种方式,

>>> l1 = [[0], [0], [12, 8, 0]]
>>> l2 = [[1], [10], [1, 100, 1]]
>>> [ ix * l2[k1][k2] for k1, item in enumerate(l1) for k2,ix in enumerate(item) ]
[0, 0, 12, 800, 0]

答案 2 :(得分:1)

列表理解很好,但它们会让人感到困惑,特别是对于一个自我描述的初学者。

这种方式(几乎)相当于Adem Oztas'回答,除了嵌套列表结构被保留:

def func(L1,L2):
    result=[]
    for xi,x in enumerate(L1):
        result.append([])
        for yi,y in enumerate(x):
            result[xi].append(y*L2[xi][yi])
    return result

print(func())

列表理解版本将是:

[[y*L2[xi][yi] for yi,y in enumerate(x)] for xi,x in enumerate(L1) ]

这保留了输入的嵌套列表结构:

[[0],[0],[12,800,0]]

相当于Apero的答案,即:

[[a*b for a,b in zip(x,y)] for x,y in zip(lst1,lst2)]

......就是这样:

def func(L1,L2):
    result=[]
    for x,y in zip(L1,L2):
        r = []
        result.append(r)
        for a,b in zip(x,y):        
            r.append(a*b)
    return result

print(func())

这两个其他答案(使用列表推导)都比我上面使用循环更好,因为这正是为列表推导创建的。但以另一种方式看待它可能有助于理解。

答案 3 :(得分:0)

 List<List<Integer>> output = new ArrayList<List<Integer>>();

    for(int i = 0;i<lis1.size();i++){
        List<Integer> subOutPut = new ArrayList<Integer>();
        for(int j = 0;j<lis1.get(i).size();j++){
            subOutPut.add(lis1.get(i).get(j)*lis2.get(i).get(j));
        }
        output.add(subOutPut);
    }

在java中你可以实现如上所述

输入:[[0], [0], [12, 8, 0]] * [[0], [0], [12, 8, 0]]

输出:[[0], [0], [12, 800, 0]]