如何在Python中平滑数值列表?

问题描述 投票:0回答:3

我有一个 Python 中的整数值列表集合,如下所示:

[0, 0, 1, 0, 1, 0, 0, 2, 1, 1, 1, 2, 1]

现在我想要一个稍微“平滑”的序列,其中具有相同的前后值(两者都不同于所讨论的中心值)的每个值都被替换为该前后值。所以我上面的列表变成:

[0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1]

(顺序或游行是从左到右,只是为了协调可能存在冲突的分组。)

我怎样才能实现列表?

奖励:与上面相同,可能的参数化必须出现多少个前后值才能更改中心值(2-2 或 3-3 而不仅仅是 1-1)。

python sequence smoothing
3个回答
1
投票

一个简单的循环就可以解决问题:

_list = [0, 0, 1, 0, 1, 0, 0, 2, 1, 1, 1, 2, 1]

for i in range(1, len(_list)-1):
    if _list[i-1] == _list[i+1]:
        _list[i] = _list[i-1]

print(_list)

输出:

[0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1]

0
投票
arr = [0, 0, 1, 0, 1, 0, 0, 2, 1, 1, 1, 2, 1]

res = [arr[0]]
i = 0

for i in range(1,len(arr)):

    if res[i-1] not in arr[i:i+2]:
        res.append(arr[i])

    else:
        res.append(res[i-1] )
print(res)

0
投票

要允许更改前/后值的数量,您可以创建一个“填充”列表,并迭代填充列表上的移动窗口以检查所有周围的值是否相同。

def smooth(lst, values=1, padding=None):
    padded = [padding] * values + lst + [padding] * values
    for i, n in enumerate(lst):
        surrounding = set(padded[i:i+values] + padded[i+values+1:i+values*2+1])
        if len(surrounding) == 1:
            yield surrounding.pop()
        else:
            yield n

print(list(smooth([0, 0, 1, 0, 1, 0, 0, 2, 1, 1, 1, 2, 1])))  # [0, 0, 0, 1, 0, 0, 0, 2, 1, 1, 1, 1, 1]

如果您的输入列表可能包含

None
,请在调用生成器时选择不同的填充参数。

© www.soinside.com 2019 - 2024. All rights reserved.