列表删除

一,循环删除动态列表,删除的过程中,列表本身会变化

1, 错误方式1

n = [1,2,3,4,5,6,7,8,9,10]
for x in n:
    n.remove(x)
    print('方法三', n)
print('方法三最后', n)

输出:

方法三 [2, 3, 4, 5, 6, 7, 8, 9, 10]
方法三 [2, 4, 5, 6, 7, 8, 9, 10]
方法三 [2, 4, 6, 7, 8, 9, 10]
方法三 [2, 4, 6, 8, 9, 10]
方法三 [2, 4, 6, 8, 10]

2, 错误方式2, 遗漏了删除4

num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(num_list)
for item in num_list:
    # if item == 2 or item == 3 or item == 4:
    if item in (3, 4, 5):
        print('被删除的元素', item)
        num_list.remove(item)
    else:
        print(item)
print(num_list)

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1
2
被删除的元素 3
被删除的元素 5
7
8
9
10
[1, 2, 4, 6, 7, 8, 9, 10]

3,错误方式3 从这个例子能学到:如果在迭代时删除某个元素,会导致列表改变,但是迭代器依旧以原来的索引顺序迭代,这会导致数据错位,引起bug

# https://www.cnblogs.com/xuchunlin/p/6049371.html 42/61
def string_reverse1(string):
    return string[::-1]

c=[5,6,7,1,2,3,4]
print(string_reverse1(c))

c=[5,6,7,1,2,3,4]
for b in c:
    print ("before:"+str(b))
    c.remove(b)
    print(c)
    print ("after:"+str(b))

输出:

[4, 3, 2, 1, 7, 6, 5]
before:5
[6, 7, 1, 2, 3, 4]
after:5
before:7
[6, 1, 2, 3, 4]
after:7
before:2
[6, 1, 3, 4]
after:2
before:4
[6, 1, 3]
after:4

2, 修改后

#代码中遍历的是n列表的复制品,从复制品中依次取出每一个元素,将n中对应的内容删除掉。
n = [1,2,3,4,5,6,7,8,9,10]
for x in n[:]:
    print('方法一', n)
    n.remove(x)

输出:

方法一 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
方法一 [2, 3, 4, 5, 6, 7, 8, 9, 10]
方法一 [3, 4, 5, 6, 7, 8, 9, 10]
方法一 [4, 5, 6, 7, 8, 9, 10]
方法一 [5, 6, 7, 8, 9, 10]
方法一 [6, 7, 8, 9, 10]
方法一 [7, 8, 9, 10]
方法一 [8, 9, 10]
方法一 [9, 10]
方法一 [10]

2, 长度循环

# 无论循环进行到哪一步,永远只删除当前列表的第一个元素,不使用不断增加的循环变量就不会出现数组下标越界了。
n = [1,2,3,4,5,6,7,8,9,10]
for x in range(len(n)):
    n.remove(n[-1])
    print('方法二', n)

输出:

方法二 [1, 2, 3, 4, 5, 6, 7, 8, 9]
方法二 [1, 2, 3, 4, 5, 6, 7, 8]
方法二 [1, 2, 3, 4, 5, 6, 7]
方法二 [1, 2, 3, 4, 5, 6]
方法二 [1, 2, 3, 4, 5]
方法二 [1, 2, 3, 4]
方法二 [1, 2, 3]
方法二 [1, 2]
方法二 [1]
方法二 []

3,从最后循环删除

def sort_select(a):
    for i in range(len(a) - 1, -1, -1):
        a.remove(a[i])
        print('哈哈哈a', a, i)

c = [5, 6, 5, 7, 1, 2, 3, 4]
sort_select(c)

输出:

哈哈哈a [5, 6, 5, 7, 1, 2, 3] 7
哈哈哈a [5, 6, 5, 7, 1, 2] 6
哈哈哈a [5, 6, 5, 7, 1] 5
哈哈哈a [5, 6, 5, 7] 4
哈哈哈a [5, 6, 5] 3
哈哈哈a [6, 5] 2
哈哈哈a [6] 1
哈哈哈a [] 0

三 详解

a = [1,2,3,4,5,6,7,8]
print(id(a))
print(id(a[:]))
for i in a[:]:
    if i > 5:
        pass
    else:
        a.remove(i)
    print(a)
print('-------------------------')
print(id(a))

输出:

2642353420480
2642351510592
[2, 3, 4, 5, 6, 7, 8]
[3, 4, 5, 6, 7, 8]
[4, 5, 6, 7, 8]
[5, 6, 7, 8]
[6, 7, 8]
[6, 7, 8]
[6, 7, 8]
[6, 7, 8]
-------------------------
2642353420480
posted @ 2021-12-14 10:20  ty1539  阅读(132)  评论(0编辑  收藏  举报