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

时间:2018-04-26 13:39:17

标签: python-3.x list function euclidean-distance acceleration

我正在尝试从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的值是以元组而不是普通数字形式出现的。

2 个答案:

答案 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会返回一个在您需要元素之前不会被评估的生成器。