Python 在按升序排序的整数列表中添加缺少的数字

Python 在按升序排序的整数列表中添加缺少的数字,python,list,Python,List,我正在尝试实现一个函数,可以在列表中插入任何缺失的数字。列表按升序排列,没有重复的元素 这是我目前的代码: def fill_in_numbers(lst): i=0 while True: if lst[-1] - lst[i] !=1: lst.insert(i+1, lst[i]+1) i+=1 if lst[-1] - lst[i]== 1: break return

我正在尝试实现一个函数,可以在列表中插入任何缺失的数字。列表按升序排列,没有重复的元素

这是我目前的代码:

def fill_in_numbers(lst):
    i=0
    while True:
        if lst[-1] - lst[i] !=1:
            lst.insert(i+1, lst[i]+1)
        i+=1
        if lst[-1] - lst[i]== 1:
            break
    return lst
因此,例如,如果输入是
填充数字([12,15,19])
,则预期输出是
[12,13,14,15,16,17,18,19]
,或者如果输入是
填充数字([-5,0,5])
,则预期输出是
[-5,-4,-3,-2,-1,0,1,2,3,4,5]

但是,当我运行代码时,第一个输入的输出是
[12,13,14,15,16,17,18,15,19]
,第二个输入的输出是
[-5,-4,-3,-2,-1,0,1,2,3,4,0,5]


我的代码有什么问题?

您可以尝试以下方法:

def fill_in_numbers(lst):
  new_list = []
  for i in range(len(lst)):
    new_list.append(lst[i])
    if i+1 < len(lst):
      [new_list.append(k) for k in range(lst[i]+1, lst[i+1])]
  return new_list


print(fill_in_numbers([12,15,19])) # --- Output --->>> [12, 13, 14, 15, 16, 17, 18, 19] 
print(fill_in_numbers([ -5,0, 5])) # --- Output --->>> [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
def填充编号(lst):
新列表=[]
对于范围内的i(len(lst)):
新增列表。追加(lst[i])
如果i+1>>[12,13,14,15,16,17,18,19]
打印(填写数字([-5,0,5]))——————>>>>[-5,-4,-3,-2,-1,0,1,2,3,4,5]

用这种方法,您可以不费吹灰之力

 def fill_in_numbers(lst):
        i=0
        lst = [a for a in range(lst[i],lst[-1]+1)]
    
        return lst
    
  print(fill_in_numbers([12,15,19]))

其他答案为您提供了解决方案,但没有解释您的答案不起作用的原因。您遇到的问题是,每次循环(直到中断)时,您都会在列表中插入一个数字,而不检查该数字是否已在列表中。这将导致所有其他非极端的原始列表条目被一直推到列表的末尾

如果您希望使用原始代码,那么修复程序只需满足第一个条件:

def fill_in_numbers(lst):
    i=0
    while True:
        if lst[i+1] != lst[i] + 1:
             lst.insert(i+1, lst[i]+1)
        i+=1
        if lst[-1] - lst[i]== 1:
            break
    return lst
如果下一个lst元素确实是序列号,则不执行第一个If语句的主体,并递增“i”迭代器,从而允许下一个循环在条件中使用此原始数字,而不是不必要的重复


这不是最干净的python代码,但对于刚开始来说也不算太糟糕:)

您的代码不正确,因为在列表中插入数字时,您不会检查该数字是否已经在列表中

我认为最简单的方法是用创建一个新的列表,并将其解包成一个列表

def fill_in_numbers(lst):
    return [*range(lst[0], lst[-1]+1)]

例如:

print(fill_in_numbers([12, 15, 19])) # Output: [12, 13, 14, 15, 16, 17, 18, 19]
print(fill_in_numbers([-5, 0, 5])) # Output: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

取第一个和最后一个值(或最小值和最大值),扔掉所有旧值,然后使用
范围
填充新值:

>>> def fill_in_numbers(lst):
...     #n1 = min(lst)
...     n1 = lst[0]
...     #n2 = max(lst)
...     n2 = lst[-1]
...     lst[:] = range(n1, n2 + 1)
...     return lst
...

>>> fill_in_numbers([3, 8 , 12])
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

根据您的逻辑,如果列表中不存在编号,则需要在列表中插入编号,否则无需在列表中插入编号

def fill_in_numbers(lst):
    i=0
    while True:
        if lst[-1] - lst[i] !=1:
            if lst[i]+1 not in lst:
                lst.insert(i+1, lst[i]+1)
        i+=1
        if lst[-1] - lst[i]== 1:
            break
    return lst
简单方法

def fill_in_numbers(lst):
    return list(range(lst[0], lst[-1]+1))

对问题中显示的代码进行的唯一实际必要更改是:

        if lst[-1] - lst[i] !=1:
您需要将
-1
更改为
i+1
,因为您正在将列表项与下一个而不是最后一个进行比较

通过该更改,您可以在给定符合约束的输入的情况下获得所需的结果


也可以考虑删除<代码>返回LST 语句(函数将返回<代码> No.< /代码>)。通常,建议函数要么修改现有列表,要么返回新列表,但最好不要既修改现有列表,又返回它,因为这可能会对如何使用函数产生混淆。在本例中,您正在修改现有列表。因此,在删除

return
语句后,调用该语句时,您可能会执行以下操作:

lst = [12,15,19]
fill_in_numbers(lst)
print(lst)

范围(lst[0],lst[-1])
?我相信你的
lst[I+1]!=lst[i]+1
应替换
lst[-1]-lst[i]=1
在原始测试中,不要使用它,因为原始测试在这里没有有用的用途(前提是输入符合规定的约束)。具体来说,一个项目可以比上一个项目少一个,同时也不能比下一个项目少一个的唯一方法是,如果存在中间项目。但是,项目和最后一个项目之间的差值必须至少为2(如果列表严格递增,并且它们之间至少有一个中间项目),因此不能出现等于1的情况。因此,测试是不必要的,应该删除。换句话说,@Python_learner's code所需的唯一更改是与下一项(而不是上一项)进行比较,而不是添加额外的测试。@alani您是绝对正确的,是的,在OP的约束条件下,最好强调这一切都是可行的。非常感谢。答案已更新以反映您的输入。但是,我应该用您的解决方案解决此问题。不,我认为while循环在这种情况下不相关,因此这是我的错误。当然,这会返回一个新列表,而不是更新传递的列表,这是完全不同的事情,实际上并不是我们想要的。但是,如果要这样做,那么与其像现在这样使用列表理解,为什么不直接使用
返回列表(范围(lst[0],lst[-1]+1))
?为什么不直接使用
返回列表(范围(lst[0],lst[-1]+1))
?然而,我相信OP希望更新原始的已通过列表,而不是返回新列表。
lst = [12,15,19]
fill_in_numbers(lst)
print(lst)