首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何平滑Python中的数值列表?

如何平滑Python中的数值列表?
EN

Stack Overflow用户
提问于 2022-11-14 10:37:57
回答 3查看 38关注 0票数 0

我收集了python中的整数值列表,如下所示:

代码语言:javascript
复制
[0, 0, 1, 0, 1, 0, 0, 2, 1, 1, 1, 2, 1]

现在,我希望有一个稍微“平滑”的序列,其中每个值具有相同的前值和后继值(这两者都不同于所讨论的中心值)被替换为这个前后的值。所以我上面的清单是:

代码语言:javascript
复制
[0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1]

(秩序或游行是从左到右,只是为了调和可能发生冲突的分组。)

我怎样才能做到清单?

奖励:与上面可能的参数化一样,改变中心值(2-2或3-3,而不是仅仅1-1)必须出现多少前跟随值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-14 10:58:44

一个简单的循环应该能做到这一点:

代码语言:javascript
复制
_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)

输出:

代码语言:javascript
复制
[0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1]
票数 1
EN

Stack Overflow用户

发布于 2022-11-14 10:53:24

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2022-11-14 11:08:27

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

代码语言:javascript
复制
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,则在调用生成器时选择不同的填充参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74430304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档