例如在此列表中:
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也不能出现在行中。
答案 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]