python 遍历list并删除部分元素
python 遍历list并删除部分元素 有两个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))
list_1
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
list_2 =[]
for i in range(5):
list_2.append(str(i))
list_2
['0', '1', '2', '3', '4']
为了提高执行效率,可以将大的list转成set
set_2 = set(list_2)
set_2
{'0', '1', '2', '3', '4'}
错误删除方式1
直接遍历list并删除元素,这种方式会导致删除之后的元素前移,后漏掉一部分元素
temp = list_1[:]
for item in temp:
if item in set_2:
temp.remove(item)
"列表长度:%d, 列表:%s" % (len(temp), temp)
"列表长度:7, 列表:['1', '3', '5', '6', '7', '8', '9']"
错误删除方式2
【python 遍历list并删除部分元素】使用下标遍历输出,删除元素,同样也会出现删除只有的元素前移导致漏掉部分元素
temp = list_1[:]
for i in range(len(temp)):
try:
if temp[i] in set_2:
temp.pop(i)
except:# 这里下标会越界,为了结果好看,不做处理
pass
"列表长度:%d, 列表:%s" % (len(temp), temp)
"列表长度:7, 列表:['1', '3', '5', '6', '7', '8', '9']"
正确方式1;倒序
倒序(保证 next 指向为未遍历过得)列表长度减少,但是next指向一直是为未遍历过的元素,并不会漏掉
temp = list_1[:]
for i in range(len(temp)-1, -1, -1):
if temp[i] in set_2:
temp.pop(i)
"列表长度:%d, 列表:%s" % (len(temp), temp)
"列表长度:5, 列表:['5', '6', '7', '8', '9']"
正确方式2;遍历复制数组,修改原数组
这种方式能保证遍历到所有元素
temp = list_1[:]
for item in temp[:]:
if item in set_2:
temp.remove(item)
"列表长度:%d, 列表:%s" % (len(temp), temp)
"列表长度:5, 列表:['5', '6', '7', '8', '9']"
正确方式3;遍历需要删除的数组
temp = list_1[:]
for item in set_2:
try:
temp.remove(item)
except: # 这里元素不存在会抛异常
pass
"列表长度:%d, 列表:%s" % (len(temp), temp)
"列表长度:5, 列表:['5', '6', '7', '8', '9']"
正确方式4;利用集合差集,不能保证顺序
temp = list_1[:]
temp = list(set(temp).difference(set_2))
"列表长度:%d, 列表:%s" % (len(temp), temp)
"列表长度:5, 列表:['8', '9', '5', '7', '6']"
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)
- Python|Python 9.20