如何以递归方式将多个元组与列表列表相乘?

时间:2018-09-30 15:34:32

标签: python arrays python-3.x list

我一直试图找出答案,但找不到解决方案,情况如下:

我有一个这样的元组列表:

list = [(5,8,3)
       ,(4,5,6)
       ,(7,8,9)]

还有另一个包含值的列表,像这样:

#the lists inside list2 are user supplied lists
list2 = [[10,20,30] 
        ,[40,50,60] 
        ,[70,80,90]]

我希望输出如下:

5*10, 5*20, 5*30
8*40, 8*50, 8*60
3*70, 3*80, 3*90

4*10, 4*20, 4*30
5*40, 5*50, 5*60
6*70, 6*80, 6*90

7*10, 7*20, 7*30
8*40, 8*50, 8*60
9*70, 9*80, 9*90

2 个答案:

答案 0 :(得分:2)

您可以使用列表推导。但是鉴于这些都是数组操作,我建议您使用专业的第三方库,例如NumPy。这是一种方法:

import numpy as np

L1 = np.array([(5, 8, 3),
               (4, 5, 6),
               (7, 8, 9)])

L2 = np.array([[10, 20, 30],
               [40, 50, 60],
               [70, 80, 90]])

res = np.transpose((L1[:, None, :] * L2[:, :, None].T), axes=[0, 2, 1])

结果:

array([[[ 50, 100, 150],
        [320, 400, 480],
        [210, 240, 270]],

       [[ 40,  80, 120],
        [200, 250, 300],
        [420, 480, 540]],

       [[ 70, 140, 210],
        [320, 400, 480],
        [630, 720, 810]]])

答案 1 :(得分:1)

嵌套列表理解

In [15]: [[[c*d for d in b] for c in a ] for a in list for b in list2]
Out[15]:
[[[50, 100, 150], [80, 160, 240], [30, 60, 90]],
 [[200, 250, 300], [320, 400, 480], [120, 150, 180]],
 [[350, 400, 450], [560, 640, 720], [210, 240, 270]],
 [[40, 80, 120], [50, 100, 150], [60, 120, 180]],
 [[160, 200, 240], [200, 250, 300], [240, 300, 360]],
 [[280, 320, 360], [350, 400, 450], [420, 480, 540]],
 [[70, 140, 210], [80, 160, 240], [90, 180, 270]],
 [[280, 350, 420], [320, 400, 480], [360, 450, 540]],
 [[490, 560, 630], [560, 640, 720], [630, 720, 810]]]