在Python中控制列表中的数据步骤
假设我有一个传感器的数据,格式是这样的:
data = [100, 140, 200, 250, 210, 300, 350, 380, 400, 333, 352, 399, 599, 899]
我想降低这些数据的分辨率,这样我就可以在后面用C++修改它的格式,以便在嵌入式设备上使用。
我想强制设置数据的分辨率。比如说:没有一个数值可以低于50,那么所有的值都必须是50的倍数,四舍五入也好,向下取整也好,我都不在乎。最终的结果应该是:
data = [100, 150, 200, 250, 250, 300, 350, 400, 400, 350, 400, 400, 600, 900]
我试过这个代码:
def curate_data(data: list, step_size: int = 1000):
def _round(number, increment, offset):
return round((number - offset) / increment) * increment + offset
curated_data = [data[0]]
for i in range(1, len(data)):
append_value = int(data[i])
if data[i] - curated_data[-1] < step_size:
# round to nearest multiple of step_size
append_value = _round(number=data[i], increment=step_size, offset=0)
curated_data.append(append_value)
return curated_data
但是它没有生成我期待的结果。
我该如何处理这些数据,以达到所需的分辨率呢?谢谢。
2 个回答
0
你只需要判断一下原来的数是不是50的倍数。如果是,那就没什么好做的;如果不是,那就用一些简单的数学运算就能得到你想要的结果:
data = [100, 140, 200, 250, 210, 300, 350, 380, 400, 333, 352, 399, 599, 899]
def roundup(n):
if (r := n % 50) != 0:
return n + 50 - r
return n
print(list(map(roundup, data)))
输出:
[100, 150, 200, 250, 250, 300, 350, 400, 400, 350, 400, 400, 600, 900]
0
你可以使用整除(floordiv)然后重新计算。你提到你不在乎是向上还是向下取整。这个方法会按照通常的取整规则来处理。
data = [100, 140, 200, 250, 210, 300, 350, 380, 400, 333, 352, 399, 599, 899]
# round integers to multiples of step
def iround_by(num:int, step:int=50) -> int:
return int((step/2+num)//step*step)
out = list(map(iround_by, data))
print(out)
输出
[100, 150, 200, 250, 200, 300, 350, 400, 400, 350, 350, 400, 600, 900]