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))