我有一个定义为
的列表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]
我对如何做到这一点有点困惑,我已经感觉我的代码没有得到很好的优化。任何帮助表示赞赏!
答案 0 :(得分:2)
您可以使用列表理解。假设您的列表已订购,您可以提取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.])
答案 1 :(得分:1)
根据对问题的评论,我可以建议以下解决方案:
B = [float(x) if x in A else 0.0 for x in range(int(min(A)), int(max(A)) + 1)]