所以,我不明白为什么我的输出返回 [1, 1, 3, 1, 3],而我想要的和想到的是 [1,1,1]。
the_list = [1, 2, 1, 2, 3, 1, 2, 3, 4]
target = 1
def keep(the_list, target):
index = 0
for x in the_list:
if x != target:
del the_list[index]
else:
pass
index += 1
print(the_list)
最佳答案
当您从列表中特定索引处删除项目时,指定索引之后的所有项目都会向前移动 1,因为列表中不能有间隙,因此删除 2
后例如,在索引 1
处,在下一次迭代中,x
将在索引 2
处变为 2
。曾经位于索引 3
处,因此您自己的 index
变量将指向错误的项目。
要从列表中就地删除项目,您应该从列表末尾开始向后计数,这样删除项目后列表的重新索引就不会影响索引的准确性
计数器:
def keep(the_list, target):
index = len(the_list) - 1
while index >= 0:
if the_list[index] != target:
del the_list[index]
index -= 1
这样:
the_list = [1, 2, 1, 2, 3, 1, 2, 3, 4]
target = 1
keep(the_list, target)
print(the_list)
将输出:
[1, 1, 1]
但请记住,从列表中删除一个项目本质上是低效的,因为它的平均时间复杂度为O(n),必须在给定索引之后移动项目,因此删除多个项目列表的复杂度变成二次方。通过仅保留等于目标值的项目,使用列表理解从旧列表构建新列表会更有效。因此,即使上面的代码向您展示了如何正确地从列表中就地删除项目,您实际上也不应该在任何生产代码中使用它。
关于python - 为什么我的程序只删除列表中的所有其他字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939783/