Python:用没有循环的邻居的平均值替换特定值

时间:2017-12-11 15:51:56

标签: python arrays

例如在此列表中:

arr = [1.0, 1.0, None, 3.0, None, 5.0, 5.0, 5.0, None, 1.0, 2.0, 3.0]

我需要将所有None替换为其邻居的平均值,不使用循环或其他函数(仅lambda)。

这应该是结果:

[1.0, 1.0, **2.0**, 3.0, **4.0**, 5.0, 5.0, 5.0, **3.0**, 1.0, 2.0, 3.0]

我尝试使用map

执行此操作
arr = list(map(lambda x: (arr[arr.index(None) - 1] + arr[arr.index(None) + 1]) / 2 if not x else x, arr))

问题是arr.index(None)只调用一次并返回2,而不是计算下一个None的索引。 所以这样结果就是:

[1.0, 1.0, **2.0**, 3.0, **2.0**, 5.0, 5.0, 5.0, **2.0**, 1.0, 2.0, 3.0]

非常感谢任何帮助。

编辑:假设无法在乞讨或结束时出现。       Nones也不能出现在行中。

1 个答案:

答案 0 :(得分:1)

您展示的示例可以通过以下方式解决:

arr = [1.0, 1.0, None, 3.0, None, 5.0, 5.0, 5.0, None, 1.0, 2.0, 3.0]
indices = range(1, len(arr)-1)

arr_new = [arr[0]] + list(map(lambda i: (arr[i-1] + arr[i+1])/2 if arr[i] is None else arr[i], indices)) + [arr[-1]]
print arr
print arr_new

但是:如果第一个或最后一个元素是None或彼此相邻的两个元素都是None,你还没有说明会发生什么,因此这些情况会在这里失败。

输出:

[1.0, 1.0, None, 3.0, None, 5.0, 5.0, 5.0, None, 1.0, 2.0, 3.0]
[1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 5.0, 3.0, 1.0, 2.0, 3.0]