我有一个 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)。
一个简单的循环就可以解决问题:
_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]
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)
要允许更改前/后值的数量,您可以创建一个“填充”列表,并迭代填充列表上的移动窗口以检查所有周围的值是否相同。
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
,请在调用生成器时选择不同的填充参数。