当元素之间存在间隙时添加值



>我有一个列表定义为

A = [1.0, 3.0, 6.0, 7.0, 8.0]

我正在尝试用零值填充列表元素之间的空白。间隙是元素之间的增量,大于一个。例如,在 1.0 和 3.0 之间有一个差距:2.0 和 3.0 和 6.0 之间有两个差距:4.0 和 5.0

我正在使用此代码,但它不完整,并且当差距大于一个增量时,我缺少添加多个值

B = []
cnt = 0
for i in range(len(A)-1):
if A[i] == A[i+1] - 1:
B.append(A[cnt])
cnt += 1
if A[i] != A[i+1] - 1:
B.append(A[cnt])
B.append(0.0)
cnt += 1

此代码的输出为:

B = [1.0, 0.0, 3.0, 0.0, 6.0, 7.0]

但是由于 3.0 和 6.0 之间有两个差距,我需要 B 看起来像这样:

B = [1.0, 0.0, 3.0, 0.0, 0.0, 6.0, 7.0]

我有点卡在如何做到这一点上,我已经有一种感觉,我的代码不是很优化。任何帮助不胜感激!

您可以使用列表推导。假设您的列表已排序,您可以提取A的第一个和最后一个索引。我们使用set来表示理解中的 O(1( 查找复杂性。

A = [1.0, 3.0, 6.0, 7.0, 8.0]
A_set = set(A)
res = [i if i in A_set else 0 for i in range(int(A[0]), int(A[-1])+1)]
print(res)
[1, 0, 3, 0, 0, 6, 7, 8]

但是,对于较大的数组,我建议您使用诸如 NumPy 之类的专业库:

import numpy as np
A = np.array([1.0, 3.0, 6.0, 7.0, 8.0]).astype(int)
B = np.zeros(A.max())
B[A-1] = A
print(B)
array([ 1.,  0.,  3.,  0.,  0.,  6.,  7.,  8.])

根据对问题的评论,我可以建议以下解决方案:

B = [float(x) if x in A else 0.0 for x in range(int(min(A)), int(max(A)) + 1)]

最新更新