在python中特定索引之后将嵌套列表中的元素相乘



我有一个嵌套列表,我想将列表中特定索引之后的所有元素彼此相乘。例如,如果我的列表是这样的(其中所有元素(a1,f,g等)都是变量)

A=[[a1,a2,a3,f, g, g ],[b1, b2,b3, d, g, d]]

我希望所有嵌套元素的第三个元素相乘在一起。因此输出将是这样的,

A=[[a1,a2,a3,f*g**2], [b1, b2, b3, d**2*g]]

另外,我想知道是否有一种方法可以在每个嵌套列表的末尾分别将剩余的元素与乘积相乘,

A=[[a1*f*g**2,a2*f*g**2, a3*f*g**2], [b1*d**2*g, b2*d**2*g, b3*d**2*g]]

我真的不知道如何开始接近这个,所以任何帮助是感激的。

对于问题的第一部分,您可以使用列表推导来遍历a的子列表,然后使用列表索引和reduce函数来计算所需的

import functools
A = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
B = [sublist[:3] + [functools.reduce(lambda x, y: x*y, sublist[3:])] for sublist in A]
print(B)

对于第二部分,最好使用显式的For循环,以便每个子列表的结束元素的乘积只计算一次

C = []
for sublist in A:
end_product = functools.reduce(lambda x, y: x*y, sublist[3:])
C.append([item*end_product for item in sublist[:3]])
print(C)

最后得到

A = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
B = [[1, 2, 3, 20], [6, 7, 8, 990]]
C = [[20, 40, 60], [5940, 6930, 7920]]

窃取对方的数据:

>>> from math import prod
>>> A = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
>>> for a in A:
a[3:] = prod(a[3:]),
>>> A
[[1, 2, 3, 20], [6, 7, 8, 990]]

如果我们没有上面的步骤:

>>> [[x * m for x in a[:3]] for a in A for m in [prod(a[3:])]]
[[20, 40, 60], [5940, 6930, 7920]]

不确定这是否是您正在寻找的,但您可以使用列表推导式和numpy:

from numpy import product
index = 5
A = [[5, 5, 2, 3, 4, 2, 1, 1, 2], [2, 4, 2, 3, 2, 4, 5, 7], [2, 3, 5, 6, 3, 5, 3, 2]]
result = [[b for i, b in enumerate(B) if i < index] + [product(B[index:])] for B in A]
print(result) # [[5, 5, 2, 3, 4, 4], [2, 4, 2, 3, 2, 140], [2, 3, 5, 6, 3, 30]]

第二个问题:

result2 = [[r * R[-1] for r in R[:-1]] for R in result]
print(result2) # [[20, 20, 8, 12, 16], [280, 560, 280, 420, 280], [60, 90, 150, 180, 90]]

最新更新