Python 有没有办法管理列表中的浮点数?

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

我目前在我的大学里从事一个项目,在那里我获得了一系列关于患者心音的信息。Arduino客户端正在测量患者的心脏声音,并通过局域网将数据发送到我的服务器。服务器对数字字符串进行解码,并使用它使用matplotlib绘制图形。我的问题如下:

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]
,但是这里的数据是一个浮点数,正如错误所说,这是不可订阅的。您似乎认为正在将一个列表传递给转换器lambda
data\u point\u num
是一个浮点列表,然后将lambda和浮点列表传递给映射。Map将从列表中获取每个float,并将每个float分别传递给lambda。所以lambda只接收一个浮点数。然后您尝试执行
data[0]
,但是这里的数据是一个浮点数,正如错误所说,这是不可订阅的。您似乎认为一个列表正在传递给转换器lambda