在Python中控制列表中的数据步骤

1 投票
2 回答
60 浏览
提问于 2025-04-13 15:33

假设我有一个传感器的数据,格式是这样的:

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]

撰写回答