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

时间:2015-12-15 16:05:09

标签: python list loops insert

背景:

这段代码非常简单,我只是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)。

任何帮助都会受到赞赏。谢谢,对不起任何英语错误。

2 个答案:

答案 0 :(得分: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)))

如果您以前没有看过发电机功能,那么它们值得学习,但上面的答案可能会有些混乱。这是一个累积列表然后在结尾处返回的版本:

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

您可能还会注意到,conditional expression可以很容易地替换if else套件。

答案 1 :(得分:1)

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

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]