首页 > 解决方案 > 有没有办法管理列表中的浮点数?

问题描述

我目前正在我的大学从事一个项目,在那里我可以获得有关患者心音的信息流。Arduino 客户端正在测量患者心脏的声音,并通过 LAN 将数据发送到我的服务器。服务器解码数字字符串并用它用 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()

如您所见,我正在尝试使用 lambda 表达式将声音电压转换为实际电压。但是,我收到了 float 不可下标的 Traceback 错误。有人可以帮助学生吗?

如果该split()函数令人困惑,那是因为客户端发送了一个包含三个值的字符串,并打包在一个更大的字符串中。例子:

b'0,765,18273;0,721,18274;0,750,18275;....'

等等。

如果您对我的项目有具体的提示和技巧要说,那么请这样做,因为我是 Python 新手

标签: pythonpython-3.xlistlambda

解决方案


克里斯·多伊尔是对的。您正在使用函数转换器将浮点列表传递给“地图”。map 将遍历这个列表的每个元素,每个元素都是一个浮点数。但是,对于每个元素,函数转换器都会尝试对其下标,这就是您收到该错误的原因。我认为你的意思是这样的:

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))

在此代码中,“updated_data_list”是一个列表列表。这将通过调用 map 传递给函数转换器,map 会将函数转换器应用于“updated_data_list”中的每个列表。由于每个列表都是可下标的,这应该可以解决错误,我认为这是您最初打算实现的(尽管如果您的任何数据点少于三个部分,这仍然会导致问题)。


推荐阅读