Python trick:filter—列表滤波

1. 问题场景

删除列表中的正数部分

my_list = [i for i in range(10)]
for it in my_list:
    if it>0:
        my_list.remove(it)
print(my_list)
out: [0, 2, 4, 6, 8]

2. 问题分析

for … in 遍历中,是利用下标遍历的,这个下标从开始就固定了:0~9
而随着remove,会造成list内元素的自动补位,从而在遍历过程中漏掉了被删元素的下一个元素

3. 解决方案

两种解决方案:使用filter函数滤波,或者倒序遍历进行删除(del或remove)
(注意,python3中filter返回一个迭代器,因此需要强制转换为list)
源码如下:

from time import time
# 初始化
length = 10000
my_list1 = [i for i in range(length)]
my_list2 = [i for i in range(length)]
my_list3 = [i for i in range(length)]
# 方法一
time1 = time()
my_list1 = list(filter(lambda x: x<=0, my_list1))
time2 = time()
# 方法二
for i in range(len(my_list2)-1, -1, -1):
    if my_list2[i]>0:
        del(my_list2[i])
time3 = time()
# 方法三
for i in range(len(my_list3)-1, -1, -1):
    if my_list3[i]>0:
        my_list3.remove(my_list3[i])
time4 = time()
# 性能评估
print("列表维度:"+str(length))
print("方法一用时:"+str(round(time2-time1,5)))
print("方法二用时:"+str(round(time3-time2,5)))
print("方法三用时:"+str(round(time4-time3,5)))

4. 性能评估

(单位:秒)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了52 篇原创文章 · 获赞 4 · 访问量 2135

猜你喜欢

转载自blog.csdn.net/qq_42191914/article/details/103938113
今日推荐