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

时间:2018-06-14 14:25:44

标签: python python-3.x list

我有一个定义为

的列表
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]

我对如何做到这一点有点困惑,我已经感觉我的代码没有得到很好的优化。任何帮助表示赞赏!

2 个答案:

答案 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)]