在增量列表中插入值不起作用

Insert value in Incremental List not working

上下文:

这段代码非常简单,我是 python 的新手。我有一个递增的数字列表,我需要做的就是检查是否有任何缺失值,如果有,则在该位置插入 -1,例如:

如果我有一个包含值 [1,2,4,5] 的列表,我希望它变成 [1,2,-1,4,5]。

如果我有一个包含值 [1,4,5] 的列表,我希望它变成 [1,-1,-1,4,5]。

简单,但我无法在 python 上正确完成。

我的代码:

id:我要修改的列表

i、j 和 z: 个计数器。

MyRange: 我无法显示变量的真实名称(我没有代码),但范围是正确的。

z=0
for i in MyRange:
       value = id[i]
       value2 = id[i+1]
       j=z
       //This while is here because I try not to compare a value with -1
       //(I think this is the problem)
       while value == -1:
            j=j-1
            value = id[j]
       if(int(value)+1 == int(value2)):
            if(value2 != -1):
                  id.insert(i,-1)
       z=z+1

此代码识别任何缺失值,然后填充列表的其余部分(从缺失值到最后一个值为 -1 的值)。

如有任何帮助,我们将不胜感激。谢谢你,如果有任何英文错误,我们深表歉意。

一个比较简单的方法是制作一组数字。然后你可以从最小数到最大数,并寻找集合中的数字。如果它在那里,你们都很好。如果不存在,则生成 -1.

def fill_range(initial_range, fill_vallue):
    smallest = initial_range[0]
    biggest = initial_range[-1]
    items = set(initial_range)
    for i in range(smallest, biggest+1):  # use xrange on python2.x
        if i in items:
            yield i
        else:
            yield fill_value

您可以像这样使用此生成器函数:

print(list(fill_range([1,2,4,5], -1)))

如果您以前没有见过生成器函数,它们值得学习,但上面的答案可能有点令人困惑。这是一个累积列表然后 returns 最后的版本:

def fill_range(initial_range, fill_vallue):
    result = []
    smallest = initial_range[0]
    biggest = initial_range[-1]
    items = set(initial_range)
    for i in range(smallest, biggest+1):
        if i in items:
            result.append(i)
        else:
            result.append(fill_value)
    return result

您可能还会注意到 if else 套件在这里可以很容易地替换为 conditional expression...

您只需要一个额外的变量来跟踪序列中缺失的元素。

def insert_minus_ones(lst):
    new_lst = []
    last = lst[0] - 1
    for e in lst:
        while (last + 1) != e:
            new_lst.append(-1)
            last += 1
        new_lst.append(e)
        last += 1
    return new_lst

上面的代码适用于任何数字序列:

>>> insert_minus_ones([1,2,4,6,10])
[1, 2, -1, 4, -1, 6, -1, -1, -1, 10]

>>> insert_minus_ones([-5,-4,-3,2])
[-5, -4, -3, -1, -1, -1, -1, 2]