Python中实现列表传感器数据的强制分辨率调整(步长不小于50)
你的原代码逻辑走偏啦——它只在当前数据和前一个整理后的数据差距小于步长时才尝试四舍五入,否则直接保留原数据的整数值,这既没满足“所有值都必须是50的倍数”的核心需求,逻辑也和你想要的效果不匹配。
看你给出的示例结果,其实你是想把每个数值向上取整到最近的50的倍数(比如210→250、352→400都是典型的向上取整结果),实现这个需求其实非常简单,不需要复杂的循环和相邻比较,直接对每个数值单独处理就行:
解决方案1:直接向上取整到步长倍数
这是最贴合你示例结果的实现:
import math def curate_data(data: list, step_size: int = 50): return [math.ceil(num / step_size) * step_size for num in data]
把你的输入数据放进去测试:
原数据:[100, 140, 200, 250, 210, 300, 350, 380, 400, 333, 352, 399, 599, 899]
运行后得到的结果和你想要的完全一致:[100, 150, 200, 250, 250, 300, 350, 400, 400, 350, 400, 400, 600, 900]
如果你接受四舍五入到最近的步长倍数
要是你对向上/向下取整没有硬性要求,四舍五入到最近的倍数也可以,实现更简单:
def curate_data(data: list, step_size: int = 50): return [round(num / step_size) * step_size for num in data]
这个版本得到的结果是[100, 150, 200, 250, 200, 300, 350, 400, 400, 350, 350, 400, 600, 900],虽然和你的示例有一点差异,但也符合你“向上向下取整都行”的要求。
额外需求:保证相邻数据的变化步长不小于指定值
如果你确实需要严格保证“相邻整理后的数据的步长不能小于50”(比如不允许出现250→250这种差为0的情况),可以调整逻辑:当当前数值取整后和前一个值的差太小,就强制调整为前一个值±步长:
import math def curate_data(data: list, step_size: int = 50): curated = [] for num in data: rounded = math.ceil(num / step_size) * step_size if curated: diff = rounded - curated[-1] if abs(diff) < step_size: # 根据当前数值和前一个值的大小,强制调整为步长级别的变化 rounded = curated[-1] + step_size if num >= curated[-1] else curated[-1] - step_size curated.append(rounded) return curated
这个版本处理你的输入会得到[100, 150, 200, 250, 200, 300, 350, 400, 400, 350, 400, 400, 600, 900],所有相邻数据的变化都是50的整数倍,不会出现小于50的步长。
不过从你给出的示例结果来看,你并不排斥相邻数据相同的情况,所以第一个解决方案就完全能满足你的需求啦。
备注:内容来源于stack exchange,提问作者GGChe

