将函数应用于 3 个元组列表中的每个元素以获得 1 个结果列表 python3

Apply function to each element in 3 lists of tuples to get 1 resultant list python3

我正在尝试根据 x、y、z 加速度计算合成加速度。我编写了一个函数,在手动输入 x、y、z 坐标时执行此操作。

def Euclidean_norm(x,y,z):
    total = (x ** 2) + (y ** 2) + (z ** 2)
    resultant = math.sqrt(total)
    return resultant

我的问题是我想使用此函数迭代 3 个列表,并生成一个新列表,其中只有合成加速度。

x_list = [(9.6,), (4.9,), (8.7,), (9.....]
y_list = [(0.6,), (2.6,), (4.6,), (2.....]
z_list = [(5.2,), (7.2,), (5.8,), (7.....]

我试过使用地图功能

print(map(Euclidean_norm(a,b,c)))

然而这给出了一个错误

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

部分问题是我从数据库中获取的 xyz 的值是元组而不是纯数字。

使用列表推导 zip():

[Euclidean_norm(*x,*y,*z) for x,y,z in zip(x_list, y_list, z_list)]

哦,你不应该将函数大写,因为大写的名称是为 类.

保留的

稍微解释一下...

zip() 函数采用任意数量的可迭代对象,"zips" 将它们组合在一起以提供由相应索引构成的元组。它是一个非常有用的函数,用于迭代相关列表,例如此处的列表。

为了更清楚地演示它:

>>> a = [1, 2, 3]
>>> b = [2, 4, 6]
>>> list(zip(a, b))
[(1, 2), (2, 4), (3, 6)]
>>> for i, j in zip(a, b):
...     print(i, j)
... 
1 2
2 4
3 6

显示了少数可能的解决方案之一。那里的主要问题是当您调用最终函数时,您的元组正在被解包。您可能需要考虑在从数据库返回它们时立即解压缩它们,因为您的代码似乎期望:

x_list = [x[0] for x in x_list]

如果您有非常大的列表,稍微快一点的版本是个好主意

from operator import itemgetter
g = itemgetter(0)
x_list = [g(x) for x in x_list]

元组解压缩后,压缩解决方案将恢复为原始提案:

resultant = [Euclidean_norm(x, y, z) for x, y, z in zip(x_list, y_list, z_list]

或者:

resultant = [Euclidean_norm(*accel) for accel in zip(x_list, y_list, z_list]

另一种选择是坚持使用 map,就像您之前尝试过的那样。您遇到的问题是语法 print(map(Euclidean_norm(a,b,c))) 没有正确使用 map。表达式 Euclidean_norm(a,b,c) 实际上就在那里调用 Euclidean_norm,然后将列表作为参数,而不是将函数对象传递给 map。你会想做类似 map(Euclidean_norm, a, b, c):

的事情
resultant = list(map(Euclidean_norm, x_list, y_list, z_list))

您需要将 list 应用于 map,因为 map returns 生成器在您需要元素之前不会被计算。