我正在尝试从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'
部分问题是我从数据库中获取的x
,y
和z
的值是以元组而不是普通数字形式出现的。
答案 0 :(得分:2)
将列表理解与zip()
:
[Euclidean_norm(*x,*y,*z) for x,y,z in zip(x_list, y_list, z_list)]
哦,你不应该将函数大写,因为大写的名字是为类保留的。
只是一点点解释......
zip()
函数接受任意数量的迭代,并将它们“拉”“在一起,以给出由相应索引构成的元组。这是一个非常有用的函数,用于迭代相关列表,如此处的那些。
为了更清楚地证明它:
>>> 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
答案 1 :(得分:0)
@JoeIddon's excellent answer显示了一些可能的解决方案之一。主要的问题是,当你调用最终函数时,你的元组被解包。您可能需要考虑从数据库返回时立即解压缩它们,因为您的代码似乎期望:
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
会返回一个在您需要元素之前不会被评估的生成器。