Python 有没有办法管理列表中的浮点数?
我目前在我的大学里从事一个项目,在那里我获得了一系列关于患者心音的信息。Arduino客户端正在测量患者的心脏声音,并通过局域网将数据发送到我的服务器。服务器对数字字符串进行解码,并使用它使用matplotlib绘制图形。我的问题如下:Python 有没有办法管理列表中的浮点数?,python,python-3.x,list,lambda,Python,Python 3.x,List,Lambda,我目前在我的大学里从事一个项目,在那里我获得了一系列关于患者心音的信息。Arduino客户端正在测量患者的心脏声音,并通过局域网将数据发送到我的服务器。服务器对数字字符串进行解码,并使用它使用matplotlib绘制图形。我的问题如下: import socket import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import datetime import sy
import socket
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import datetime
import sys
converter = lambda data: (data[0], data[1]/1023*5, data[2]/1000)
HOST = ''
PORT = 1236
address = (HOST, PORT)
fig, ax = plt.subplots()
plt.style.use('seaborn')
plt.tight_layout()
fig.show()
x, y = [], []
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((address))
s.listen(1)
conn, addr = s.accept()
with conn:
print(f"Connectet to Client {addr}")
try:
while True:
data = conn.recv(4096).decode("utf-8")
if data == "STOP":
break
else:
data_list = data.split(";")
for d in data_list:
data_point = d.split(",")
if len(data_point) > 3:
data_point = ''
else:
data_point_num = [float(i) for i in data_point]
print(type(data_point_num))
real_data = list(map(converter, data_point_num))
finally:
sys.exit()
正如你们所看到的,我试图用一个λ表达式将声压转换成实际电压。然而,我得到的回溯错误是float不可下标。有人能帮助一个学生吗
如果split()
函数令人困惑,那是因为客户端发送了一个包含三个值的字符串,并将其打包成一个更大的字符串。例如:
b'0,765,18273;0,721,18274;0,750,18275;....'
等等
如果您对我的项目有一些特别的提示和技巧,那么请说,因为我是Python新手,Chris Doyle是对的。您正在使用函数转换器将浮点列表传递给“映射”。映射将迭代该列表的每个元素,每个元素都是一个浮点。但是,对于每个元素,函数转换器将尝试为其下标,这就是为什么会出现该错误。我想你的意思是这样的:
data_list = data.split(';')
updated_data_list = []
for d in data_list:
data_point = d.split(',')
if len(data_point) > 3:
data_point = ''
else:
data_point_num = [float(i) for i in data_point]
updated_data_list.append(data_point_num)
real_data = list(map(converter, updated_data_list))
在此代码中,“更新的数据列表”是一个列表列表。这将通过调用map传递给函数转换器,map将函数转换器应用于“更新的数据列表”中的每个列表。由于每个列表都是可下标的,所以这应该可以避免错误,我认为这是您最初打算实现的目标(尽管如果您的任何数据点少于三个部分,这仍然会导致问题)。Chris Doyle是对的。您正在使用函数转换器将浮点列表传递给“映射”。映射将迭代该列表的每个元素,每个元素都是一个浮点。但是,对于每个元素,函数转换器将尝试为其下标,这就是为什么会出现该错误。我想你的意思是这样的:
data_list = data.split(';')
updated_data_list = []
for d in data_list:
data_point = d.split(',')
if len(data_point) > 3:
data_point = ''
else:
data_point_num = [float(i) for i in data_point]
updated_data_list.append(data_point_num)
real_data = list(map(converter, updated_data_list))
在此代码中,“更新的数据列表”是一个列表列表。这将通过调用map传递给函数转换器,map将函数转换器应用于“更新的数据列表”中的每个列表。由于每个列表都是可下标的,所以这应该可以避免错误,我认为这是您最初打算实现的目标(尽管如果您的任何数据点少于三个部分,这仍然会导致问题)。Python map接受一个列表,并使用提供的函数处理每个元素 例如:
# Return square of x
def square(x):
return x**2
numbers = [13, 21, 39, 24, 100]
result = map(square, numbers)
print(list(result))
# same implementation using lambda
result = map(lambda x: x**2, numbers)
print(list(result))
对代码进行正确的实现
# input data
data = "0,765,18273;0,721,18274;0,750,18275;"
# split based on ';' and removing the empty at the end
data_list = data.split(";")[:-1]
# inserting a list of list
# [['0', '765', '18273'], ['0', '721', '18274'], ['0', '750', '18275']]
for i in range(len(data_list)):
data_list[i] = data_list[i].split(",")
converter = lambda data: (float(data[0]),float(data[1])/1023*5,float(data[2])/1000)
real_data = list(map(converter, data_list))
print(real_data)
Python映射接受一个列表,并使用提供的函数处理每个元素 例如:
# Return square of x
def square(x):
return x**2
numbers = [13, 21, 39, 24, 100]
result = map(square, numbers)
print(list(result))
# same implementation using lambda
result = map(lambda x: x**2, numbers)
print(list(result))
对代码进行正确的实现
# input data
data = "0,765,18273;0,721,18274;0,750,18275;"
# split based on ';' and removing the empty at the end
data_list = data.split(";")[:-1]
# inserting a list of list
# [['0', '765', '18273'], ['0', '721', '18274'], ['0', '750', '18275']]
for i in range(len(data_list)):
data_list[i] = data_list[i].split(",")
converter = lambda data: (float(data[0]),float(data[1])/1023*5,float(data[2])/1000)
real_data = list(map(converter, data_list))
print(real_data)
data\u point\u num
是一个浮点列表,然后将lambda和浮点列表传递给map。Map将从列表中获取每个float,并将每个float分别传递给lambda。所以lambda只接收一个浮点数。然后您尝试执行data[0]
,但是这里的数据是一个浮点数,正如错误所说,这是不可订阅的。您似乎认为正在将一个列表传递给转换器lambdadata\u point\u num
是一个浮点列表,然后将lambda和浮点列表传递给映射。Map将从列表中获取每个float,并将每个float分别传递给lambda。所以lambda只接收一个浮点数。然后您尝试执行data[0]
,但是这里的数据是一个浮点数,正如错误所说,这是不可订阅的。您似乎认为一个列表正在传递给转换器lambda