使用for循环从列表中删除索引范围

时间:2019-01-20 12:27:06

标签: python list indexing range

此代码有什么问题?

def remove_middle(lst, start, end):
    for i in range(start, end+1): 
        del lst[i]
    return lst

它应该删除在开始和结束(包括)之间的索引中放置的所有元素。在下面的示例中,它应该返回[4, 23, 42],但是当我运行代码时,我得到的是[4, 15, 23]

print(remove_middle([4, 8, 15, 16, 23, 42], 1, 3))

1 个答案:

答案 0 :(得分:-1)

每次删除值时,列表都会更改大小,并且您正在使用索引来删除值。 for循环在每次迭代中相继应用逻辑,而不是同时应用。

相反,您可以将enumerate用于列表理解:

def remove_middle(lst, start, end):
    return [val for idx, val in enumerate(lst) if idx not in range(start, end+1)]

How to remove items from a list while iterating?

涵盖了更一般的情况

但是,在这种特定情况下,您可以使用列表切片:

def remove_middle(lst, start, end):
    return lst[:start] + lst[end+1:]