我收集了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)必须出现多少前跟随值。
发布于 2022-11-14 10:58:44
一个简单的循环应该能做到这一点:
_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]发布于 2022-11-14 10:53:24
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)发布于 2022-11-14 11:08:27
要允许更改前面/下面的值的数量,您可以创建一个“衬垫”列表,并在填充列表上的一个移动窗口中进行迭代,以检查周围的所有值是否相同。
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,则在调用生成器时选择不同的填充参数。
https://stackoverflow.com/questions/74430304
复制相似问题