Python 遍历列表A中的组并乘以列表B中的项

Python 遍历列表A中的组并乘以列表B中的项,python,Python,我想用listA中的前9项乘以ListB中的第一项,然后用listA中的下一组9项乘以ListB中的第二项,依此类推。到目前为止,我有以下内容,但它不起作用--newlist只包含一组9项(应该是12组9项) 您可以将第一个列表分组到单独的一行,然后使用zip: a = list(range(81)) #example data b = range(1, 10) #example data new_a = [a[i:i+9] for i in range(0, len(a), 9)] final

我想用
listA
中的前9项乘以
ListB
中的第一项,然后用
listA
中的下一组9项乘以
ListB
中的第二项,依此类推。到目前为止,我有以下内容,但它不起作用--
newlist
只包含一组9项(应该是12组9项)


您可以将第一个列表分组到单独的一行,然后使用
zip

a = list(range(81)) #example data
b = range(1, 10) #example data
new_a = [a[i:i+9] for i in range(0, len(a), 9)]
final_results = [[c*j for c in i] for i, j in zip(new_a, b)]
输出:

[[0, 1, 2, 3, 4, 5, 6, 7, 8], [18, 20, 22, 24, 26, 28, 30, 32, 34], [54, 57, 60, 63, 66, 69, 72, 75, 78], [108, 112, 116, 120, 124, 128, 132, 136, 140], [180, 185, 190, 195, 200, 205, 210, 215, 220], [270, 276, 282, 288, 294, 300, 306, 312, 318], [378, 385, 392, 399, 406, 413, 420, 427, 434], [504, 512, 520, 528, 536, 544, 552, 560, 568], [648, 657, 666, 675, 684, 693, 702, 711, 720]]

选项1:使用嵌套for循环进行列表理解

此解决方案在列表中使用嵌套的
for
循环
itertools.islice
允许我们在不形成中间列表的情况下构建结果

from itertools import islice

A = list(range(1, 28))
B = list(range(1, 4))

res = [i*B[k] for k in range(int(len(A)/9)) for i in islice(A, k*9, (k+1)*9)]

print(res)

[1, 2, 3, 4, 5, 6, 7, 8, 9,
 20, 22, 24, 26, 28, 30, 32, 34, 36,
 57, 60, 63, 66, 69, 72, 75, 78, 81]
选项2:使用zip+itertools进行列表理解。重复

itertools.repeat
将一个元素重复n次。与
zip
itertools.chain
一起,您可以将其处理为所需的iterable

from itertools import chain, repeat

B_repeated = chain.from_iterable(zip(*repeat(B, 9)))
res = [i*j for i, j in zip(A, B_repeated)]
选项3:numpy.重复

如果您可以使用第三方库,
numpy
提供了一个简单的解决方案:

import numpy as np

res = A * np.repeat(B, 9)

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9,
       20, 22, 24, 26, 28, 30, 32, 34, 36,
       57, 60, 63, 66, 69, 72, 75, 78, 81])
一般建议:尝试使用python的内置功能,如lambda、zip、, 尽可能频繁地映射、过滤等


如果我理解正确,您希望将列表A中的每个值乘以列表B中的一个值。例如,如果数字1在列表B中,您希望将其乘以列表A中的每个值,例如(1*1、1*2、1*3……)等等。然后,您希望将其附加到名为“new_list”的列表中。下面是一个可以做到这一点的示例:

list_a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list_b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
new_list = []

for num in list_b:
    for number in list_a:
        new_num = number * num
        new_list.append(new_num)

print(new_list)
这里,我们从一个for循环开始,该循环遍历列表B中的所有12个数字。然后它将遍历列表a中的所有9个数字,并将B*a中的每个数字相乘。正如您所述,您应该得到108个结果,而不是您得到的输出(9*12)。我们将输出附加到新列表中

以下是您的输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81, 10, 20, 30, 40, 50, 60, 70, 80, 90, 11, 22, 33, 44, 55, 66, 77, 88, 99, 12, 24, 36, 48, 60, 72, 84, 96, 108]

另一种方法是:使
listB
listA
具有双重列表理解

listA = list(range(9 * 12))
listB = list(range(9))

res = [a * b for a, b in zip(listA, [b_ for b in listB for b_ in [b] * 12])]
要获取组,请执行以下操作:

In [872]: list(zip(*(res[i::9] for i in range(9))))
Out[872]: 
[(0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 12, 13, 14, 15, 16, 17),
 (18, 19, 20, 21, 22, 23, 48, 50, 52),
 (54, 56, 58, 60, 62, 64, 66, 68, 70),
 (108, 111, 114, 117, 120, 123, 126, 129, 132),
 (135, 138, 141, 192, 196, 200, 204, 208, 212),
 (216, 220, 224, 228, 232, 236, 300, 305, 310),
 (315, 320, 325, 330, 335, 340, 345, 350, 355),
 (432, 438, 444, 450, 456, 462, 468, 474, 480),
 (486, 492, 498, 588, 595, 602, 609, 616, 623),
 (630, 637, 644, 651, 658, 665, 768, 776, 784),
 (792, 800, 808, 816, 824, 832, 840, 848, 856)]

您可以将
ListB
展开9倍,而不是将
ListA
切碎。如果使用生成器表达式执行此操作,则甚至不需要额外存储。扩展可以使用这个答案中的双重理解:

如果你愿意,你可以把它组合成一行。这个解决方案很好,因为它既不需要导入也不需要索引,只需要基本的迭代。这使得扩展功能更加容易。例如,如果您有一个iterable,它告诉您组大小,而不是总是有9个:

genB = (x for x, count in zip(ListB, counts) for _ in range(count))

@jpp。我不认为OP要求修改
itertools.product
。我敢肯定这是不对的
In [872]: list(zip(*(res[i::9] for i in range(9))))
Out[872]: 
[(0, 0, 0, 0, 0, 0, 0, 0, 0),
 (0, 0, 0, 12, 13, 14, 15, 16, 17),
 (18, 19, 20, 21, 22, 23, 48, 50, 52),
 (54, 56, 58, 60, 62, 64, 66, 68, 70),
 (108, 111, 114, 117, 120, 123, 126, 129, 132),
 (135, 138, 141, 192, 196, 200, 204, 208, 212),
 (216, 220, 224, 228, 232, 236, 300, 305, 310),
 (315, 320, 325, 330, 335, 340, 345, 350, 355),
 (432, 438, 444, 450, 456, 462, 468, 474, 480),
 (486, 492, 498, 588, 595, 602, 609, 616, 623),
 (630, 637, 644, 651, 658, 665, 768, 776, 784),
 (792, 800, 808, 816, 824, 832, 840, 848, 856)]
genB = (x for x in ListB for _ in range(9))
newlist = [n * x for n, x in zip(ListA, genB)]
genB = (x for x, count in zip(ListB, counts) for _ in range(count))