Python中使用范围的删除

Python中使用范围的删除,python,Python,我想从索引4到9删除列表中的所有元素。 为什么下面的代码不起作用 m=[0,1,2,3,4,5,6,7,8,9] for i in range(4,10,1): del m[i] 输出为: Traceback (most recent call last): File "<pyshell#45>", line 2, in <module> del m[i] IndexError: list assignment index out of range

我想从索引4到9删除列表中的所有元素。 为什么下面的代码不起作用

m=[0,1,2,3,4,5,6,7,8,9]
for i in range(4,10,1):
    del m[i]
输出为:

Traceback (most recent call last):
  File "<pyshell#45>", line 2, in <module>
    del m[i]
IndexError: list assignment index out of range
[0, 1, 2, 3]
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
德尔m[i]
索引器:列表分配索引超出范围

但是在这之后,m的内容变成了“[0,1,2,3,5,7,9]

一个问题是,
delm[i]
是顺序发生的,而不是同时发生的。当
i
的值增大时,
m
的大小减小,因此原始元素已向左移动,不再处于原始位置

在任何情况下,删除一系列元素的更好方法是使用切片,例如:

m[start:end] = []
m=[0,1,2,3,4,5,6,7,8,9]

for i in range(4,10,1):
    print(i)
    del m[i]
    print(m)
这将删除索引为
start
的元素<代码>结束-1

要使用范围内的一个步骤,则可以使用带有步骤的切片的
del

del m[start:end:step]

对于循环中删除的每个元素,索引和列表长度都会发生变化。因此,在某一点上,您正在访问一个高于列表长度的索引

只需使用列表切片即可:

# If you want the first 4 elements
m=[0,1,2,3,4,5,6,7,8,9]
print(m[:4]) # prints [0,1,2,3]

# Or if you want to go slicing from reverse:
m=[0,1,2,3,4,5,6,7,8,9]
print(m[:-6]) # prints [0,1,2,3]

删除元素时,列表大小正在缩小。以此为例:

m[start:end] = []
m=[0,1,2,3,4,5,6,7,8,9]

for i in range(4,10,1):
    print(i)
    del m[i]
    print(m)
输出

Traceback (most recent call last):
 line 5, in <module>
    del m[i]
IndexError: list assignment index out of range
4
[0, 1, 2, 3, 5, 6, 7, 8, 9]
5
[0, 1, 2, 3, 5, 7, 8, 9]
6
[0, 1, 2, 3, 5, 7, 9]
7

Process finished with exit code 1
回溯(最近一次呼叫最后一次):
第5行,在
德尔m[i]
索引器:列表分配索引超出范围
4.
[0, 1, 2, 3, 5, 6, 7, 8, 9]
5.
[0, 1, 2, 3, 5, 7, 8, 9]
6.
[0, 1, 2, 3, 5, 7, 9]
7.
进程已完成,退出代码为1

当要删除的索引为7时,您可以看到脚本失败,但列表的索引范围为0-6,因此索引超出范围。

您正在从迭代的序列中删除;删除项目时,其余项目的位置将发生更改

可以从最高索引开始,以相反的顺序执行此操作,但必须注意范围的边界:

m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for i in range(9, 3, -1): 
    m.pop(i)

m
或者,您可以通过构建一个新的列表来保存所需的项目:

m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
res = []
for idx, elt in enumerate(m):
    if idx not in range(4, 10):
        res.append(elt)
m = res

m
在这两种情况下,输出为:

Traceback (most recent call last):
  File "<pyshell#45>", line 2, in <module>
    del m[i]
IndexError: list assignment index out of range
[0, 1, 2, 3]

您可以使用删除方法:

m=[0,1,2,3,4,5,6,7,8,9]
for i in range(4,10,1):
    m.remove(i)

print(m)

[0, 1, 2, 3]

如果删除元素4,则所有较高的元素将向下移动以填充间隙。因此,您删除的下一个索引将关闭1。每次删除另一个元素时,都会增加偏移量并删除错误的元素。可能重复的元素您能建议一种使用步骤删除元素的方法吗?就像我们想删除替代元素一样?@Knight\u bot在这种情况下,您可以使用
delm[start:end:step]