python如何删除项目_在python中删除多个列表中的几个项目的最有效方法?

https://wiki.python.org/moin/TimeComplexity

remove是O(n),因为它首先在列表中线性搜索,然后,如果找到它,则删除的对象之后的每个元素都会在内存中向左移动一个位置.因此,移除是相当昂贵的操作.

因此,从长度为N的列表中删除M个项来得O(N * M)

在列表中也是O(n)因为我们需要按顺序搜索整个列表.因此,使用过滤器构建新列表也是O(N * M).但是,由于散列使得我们的滤波器O(N),在on set上是O(1)

因此,最好的解决方案是(我只是为了简单而使用平面列表,而不是嵌套)

def remove_kill_from_data(data,kill):

s = set(kill)

return [i for i in data if i not in kill]

如果你不关心保持秩序,这将更快(由于在C级完成,它仍然是O(N))

def remove_kill_from_data_unordered(data,kill):

s = set(kill)

d = set(data)

return d - s

应用于您的列表列表

kill_set = set(kill)

[remove_kill_from_data(d,kill_set) for d in data]

一些时间(每次从静态数据复制)

%timeit method1(data,kill)

210 ms ± 769 µs per loop (mean ± std. dev. of 7 runs,1 loop each)

%timeit method2(data,kill)

208 ms ± 2.89 ms per loop (mean ± std. dev. of 7 runs,1 loop each)

%timeit method3(data,kill)

272 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs,1 loop each)

%timeit method4(data,kill) # using remove_kill_from_data

69.6 ms ± 1.33 ms per loop (mean ± std. dev. of 7 runs,10 loops each)

%timeit method5(data,kill) # using remove_kill_from_data_unordered

59.5 ms ± 3.7 ms per loop (mean ± std. dev. of 7 runs,10 loops each)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值