将函数应用于 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'
部分问题是我从数据库中获取的 x
、y
和 z
的值是元组而不是纯数字。
使用列表推导 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 生成器在您需要元素之前不会被计算。
我正在尝试根据 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
的值是元组而不是纯数字。
使用列表推导 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 生成器在您需要元素之前不会被计算。