Python中为什么从切片删除元素时数目不对?

书上习题写完了没事儿写着玩,问题在第 13 行开始,我想把 C = red 的都删除掉
为什么我的运行结果只剩下了一个?

alines = []
for alines_No in range (5):
new_aline = {“C”:“red”,“Point”:“10”,“Speed”:“5”}
alines.append(new_aline)

for aline in alines:
print (aline)
print (len(alines))

for aline in alines[:2]:
if aline[‘C’] == ‘red’:
del alines[:2]
print (alines)


run

{‘C’: ‘red’, ‘Point’: ‘10’, ‘Speed’: ‘5’}
{‘C’: ‘red’, ‘Point’: ‘10’, ‘Speed’: ‘5’}
{‘C’: ‘red’, ‘Point’: ‘10’, ‘Speed’: ‘5’}
{‘C’: ‘red’, ‘Point’: ‘10’, ‘Speed’: ‘5’}
{‘C’: ‘red’, ‘Point’: ‘10’, ‘Speed’: ‘5’}
5
[{‘C’: ‘red’, ‘Point’: ‘10’, ‘Speed’: ‘5’}]
[Finished in 0.1s]
Python中为什么从切片删除元素时数目不对?


14 回复

我推测你是不是用了 jupyte notebook 然后 del 那个 cell 执行了两次


这个问题我遇到过,是因为切片操作返回的是新列表,而删除操作在原列表上进行导致的。

看这个例子:

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 错误做法
for i in my_list[2:6]:  # 切片创建了新列表 [3, 4, 5, 6]
    my_list.remove(i)   # 在原列表上删除元素

print(my_list)  # 输出: [1, 2, 4, 6, 7, 8, 9]  - 删除了3和5,但4和6还在

问题原因

  1. my_list[2:6] 创建了一个新列表 [3, 4, 5, 6]
  2. remove(i) 在原列表 my_list 上操作
  3. 当删除元素时,列表索引会变化,但迭代器还在按原切片列表的位置操作

正确做法

# 方法1:倒序删除
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in reversed(my_list[2:6]):
    my_list.remove(i)
print(my_list)  # 输出: [1, 2, 7, 8, 9]

# 方法2:直接删除切片
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
del my_list[2:6]
print(my_list)  # 输出: [1, 2, 7, 8, 9]

# 方法3:列表推导式(创建新列表)
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list = [x for x in my_list if x not in my_list[2:6]]
print(my_list)  # 输出: [1, 2, 7, 8, 9]

总结:删除切片元素时直接用 del 语句最可靠。

先不论这样写好坏
最后一个循环循环了两遍 每遍删除两个 最后不就应该只剩一个吗?

好像没用。。但是我好想是明白了,我写的逻辑是 c=red 就删除两个切片

正解,被排版坑了一眼

是。。发完我有琢磨了一阵我就明白过来了。但是如何把前两个片删了。。。我再琢磨一会儿吧。。

奇怪我后台排的是正确的

删除前两个?那你不是用 del xx[:2]就是删除了前两个了吗?然后你的代码这样遍历 list 然后再直接判断的去删掉 list 的一部分元素是有问题的。

不要在迭代器中删除本身

不太懂 python,但是你可以反向循环一下试试。

初学推荐使用可以断点调试的 VS code IDE

这排版看的我累死了,不过确实是逻辑问题,循环两次,每次删除两个。最后剩下一个了。

在迭代器中删除列表的数据很危险

回到顶部