python - 为什么我的程序只删除列表中的所有其他字符?

标签 python list

所以,我不明白为什么我的输出返回 [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/

相关文章:

python - 我如何转换这个包含每个单词及其重复次数的元组?

python - logging.StreamHandler.setLevel(logging.DEBUG) <--- 不起作用

c# - 无法在 C# 中获得与在 python 中相同的哈希值

python - 鼠兔与 celery ,连接已关闭

python - 如何将 Pandas Dataframe 中的字符串转换为列表或字符数组?

Python 检查项目是否在列表中

python - fatal error C1083 : Cannot open include file: 'atlbase.h' Pyinsane package

java - 比较作为文件名一部分的两个文件之间的时间

python - Lambda 用于不同的列表元素

python - 如何在 Python 中将数组(二维列表)分配给字典?