两个二维列表的元素乘积

Hog*_*123 3 python list python-2.7

我不能使用Numpy或任何其他库函数,因为这是我必须要做的一个问题,我必须定义自己的方式.

我正在编写一个函数,它将两个列表(2维)作为参数.该函数应计算两个列表的元素乘积并将它们存储在第三个列表中,并从函数返回该结果列表.输入列表的示例是:

列表1:

[[2,3,5,6,7],[5,2,9,3,7]]  
Run Code Online (Sandbox Code Playgroud)

列表2:

[[5,2,9,3,7],[1,3,5,2,2]]
Run Code Online (Sandbox Code Playgroud)

该函数打印以下列表:

[[10, 6, 45, 18, 49], [5, 6, 45, 6, 14]] 
Run Code Online (Sandbox Code Playgroud)

也就是说2*5=10,3*2=6,5*9=45...等等.

这是我下面的代码,但它仅适用于里面有2个列表(元素)的列表,就像上面的例子一样,并且完全可以正常工作,但我想要的是编辑我的代码,这样无论多少个列表(元素)存在于二维列表中,它应该在一个新的二维列表中打印出它的元素产品,例如它也应该适用于

[[5,2,9,3,7],[1,3,5,2,2],[1,3,5,2,2]]
Run Code Online (Sandbox Code Playgroud)

要么

[[5,2,9,3,7],[1,3,5,2,2],[1,3,5,2,2],[5,2,9,3,7]]
Run Code Online (Sandbox Code Playgroud)

或整个列表中的任意数量的列表.

def ElementwiseProduct(l,l2):
    i=0
    newlist=[] #create empty list to put prouct of elements in later
    newlist2=[]
    newlist3=[] #empty list to put both new lists which will have proudcts in them
    while i==0:
        a=0
        while a<len(l[i]):
            prod=l[i][a]*l2[i][a] #corresponding product of lists elements
            newlist.append(prod) #adding the products to new list
            a+=1
        i+=1
    while i==1:
        a=0
        while a<len(l[i]):
            prod=l[i][a]*l2[i][a] #corresponding product of lists elements
            newlist2.append(prod) #adding the products to new list
            a+=1
        i+=1
    newlist3.append(newlist)
    newlist3.append(newlist2)
    print newlist3

#2 dimensional list example
list1=[[2,3,5,6,7],[5,2,9,3,7]] 
list2=[[5,2,9,3,7],[1,3,5,2,2]]  
ElementwiseProduct(list1,list2)
Run Code Online (Sandbox Code Playgroud)

Mos*_*oye 6

您可以zip在两个列表中的一个列表理解,再往后zip所产生的子表,然后最后乘以项目:

list2 = [[5,2,9,3,7],[1,3,5,2,2]]
list1 = [[2,3,5,6,7],[5,2,9,3,7]]

result = [[a*b for a, b in zip(i, j)] for i, j in zip(list1, list2)]
print(result)
# [[10, 6, 45, 18, 49], [5, 6, 45, 6, 14]]
Run Code Online (Sandbox Code Playgroud)

如果列表/子列表不具有相同数量的元素,itertools.izip_longest则可以用于生成填充值,例如较小列表的空子列表,或者较短子列表的0:

from itertools import izip_longest

list1 = [[2,3,5,6]]
list2 = [[5,2,9,3,7],[1,3,5,2,2]]
result = [[a*b for a, b in izip_longest(i, j, fillvalue=0)] 
               for i, j in izip_longest(list1, list2, fillvalue=[])]
print(result)
# [[10, 6, 45, 18, 0], [0, 0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

您可以将内部fillvalue从0 更改为1以按原样返回较长子列表中的元素,而不是同类0.


参考:

列表理解