python遍历list元素_python 遍历list并删除部分元素

python 遍历list并删除部分元素

https://blog.csdn.net/afgasdg/article/details/82844403

有两个list,list_1 为0-9,list_2 为0-4,需要删除list_1中包含在list_2中的元素

list_1 =[]

for i in range(10):

list_1.append(str(i))

1

2

3

1

2

3

list_1

1

1

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

1

list_2 =[]

for i in range(5):

list_2.append(str(i))

1

2

3

1

2

3

list_2

1

1

['0', '1', '2', '3', '4']

1

为了提高执行效率,可以将大的list转成set

set_2 = set(list_2)

1

1

set_2

1

1

{'0', '1', '2', '3', '4'}

1

错误删除方式1

直接遍历list并删除元素,这种方式会导致删除之后的元素前移,后漏掉一部分元素

temp = list_1[:]

for item in temp:

if item in set_2:

temp.remove(item)

1

2

3

4

1

2

3

4

"列表长度:%d, 列表:%s" % (len(temp), temp)

1

1

"列表长度:7, 列表:['1', '3', '5', '6', '7', '8', '9']"

1

错误删除方式2

使用下标遍历输出,删除元素,同样也会出现删除只有的元素前移导致漏掉部分元素

temp = list_1[:]

for i in range(len(temp)):

try:

if temp[i] in set_2:

temp.pop(i)

except:# 这里下标会越界,为了结果好看,不做处理

pass

1

2

3

4

5

6

7

1

2

3

4

5

6

7

"列表长度:%d, 列表:%s" % (len(temp), temp)

1

1

"列表长度:7, 列表:['1', '3', '5', '6', '7', '8', '9']"

1

正确方式1;倒序

倒序(保证 next 指向为未遍历过得)列表长度减少,但是next指向一直是为未遍历过的元素,并不会漏掉

temp = list_1[:]

for i in range(len(temp)-1, -1, -1):

if temp[i] in set_2:

temp.pop(i)

1

2

3

4

1

2

3

4

"列表长度:%d, 列表:%s" % (len(temp), temp)

1

1

"列表长度:5, 列表:['5', '6', '7', '8', '9']"

1

正确方式2;遍历复制数组,修改原数组

这种方式能保证遍历到所有元素

temp = list_1[:]

for item in temp[:]:

if item in set_2:

temp.remove(item)

1

2

3

4

1

2

3

4

"列表长度:%d, 列表:%s" % (len(temp), temp)

1

1

"列表长度:5, 列表:['5', '6', '7', '8', '9']"

1

正确方式3;遍历需要删除的数组

temp = list_1[:]

for item in set_2:

try:

temp.remove(item)

except: # 这里元素不存在会抛异常

pass

1

2

3

4

5

6

1

2

3

4

5

6

"列表长度:%d, 列表:%s" % (len(temp), temp)

1

1

"列表长度:5, 列表:['5', '6', '7', '8', '9']"

1

正确方式4;利用集合差集,不能保证顺序

temp = list_1[:]

temp = list(set(temp).difference(set_2))

1

2

1

2

"列表长度:%d, 列表:%s" % (len(temp), temp)

1

1

"列表长度:5, 列表:['8', '9', '5', '7', '6']"

---------------------

作者:java爱好者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值