【发布时间】:2014-11-18 19:42:48
【问题描述】:
有谁知道如何将列表列表乘以列表列表?
[[0], [0], [12, 8, 0]][[1], [10], [1, 100, 1]
预期结果:[[0],[0], [12,800, 0]].
当我尝试时,我总是得到:
TypeError: 不能将序列乘以 'list 类型的非 int。
【问题讨论】:
标签: python list multiplication nested-lists
有谁知道如何将列表列表乘以列表列表?
[[0], [0], [12, 8, 0]][[1], [10], [1, 100, 1]
预期结果:[[0],[0], [12,800, 0]].
当我尝试时,我总是得到:
TypeError: 不能将序列乘以 'list 类型的非 int。
【问题讨论】:
标签: python list multiplication nested-lists
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]
在本例中,它之所以有效,是因为 lst1 和 lst2 具有相同数量的子列表,它们也具有相同数量的整数项。
【讨论】:
另一种方式,
>>> 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]
【讨论】:
列表推导很棒,但它们可能会让人感到困惑,尤其是对于自称是初学者的人。
这种方式(几乎)等同于 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())
这两个其他答案(使用列表推导)都比我上面使用循环所做的要好,因为这正是创建列表推导的目的。但是以另一种方式看到它可能有助于理解。
【讨论】:
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]]
【讨论】: