背景:
这段代码非常简单,我只是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)。
任何帮助都会受到赞赏。谢谢,对不起任何英语错误。
答案 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]