我有2个列表
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]
我希望输出为:
c=[[8,12,20],[6,12,4],[1,3,2]]
目前我正在使用以下代码,但问题是计算时间非常长,因为我列表中的值非常大。第一个列表列表有1000个列表,其中每个列表有10000个值,第二个列表有1000个值。因此计算时间是一个问题。我想要一个新的想法,其中计算时间较少。现在的代码是:
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]
c=[]
s=0
for i in b:
c1=[]
t=0
s=s+1
for j in a:
t=t+1
for k in j:
if t==s:
m=i*k
c1.append(m)
c.append(c1)
print(c)
答案 0 :(得分:4)
你可以使用numpy:
>>> import numpy as np
>>> a=np.array([[2,3,5],[3,6,2],[1,3,2]])
>>> b=np.array([4,2,1])
>>> a*np.vstack(b)
array([[ 8, 12, 20],
[ 6, 12, 4],
[ 1, 3, 2]])
或者@ csunday95建议您采用更优化的方式,而不是vstack
使用转置:
>>> (a.T*b).T
array([[ 8, 12, 20],
[ 6, 12, 4],
[ 1, 3, 2]])
答案 1 :(得分:4)
使用zip()
组合每个list
:
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]
[[m*n for n in second] for m, second in zip(b,a)]
答案 2 :(得分:-1)
这可能不会更快,但这是一种更简洁的方式:)
c = []
b_len = len(b)
for i in range(len(a)):
b_multiplier = b[i%b_len]
c.append([x*b_multiplier for x in a[i]])
现在替代方法我已经正确地阅读了这个问题并且意识到a
和b
的长度相同:
c = [[x*b[i] for x in a[i]] for i in range(len(a))]