python列表删除子列表_如果列表(即子列表)中的任何元素在另一个列表中,如何删除该列表中的列表?...

使用set和all():>>> omit = {99, 60, 98}

>>> full_list = [[1, 1, 3, 4], [3, 99, 5, 2],[2, 4, 4], [3, 4, 5, 2, 60]]

>>> [item for item in full_list if all(x not in omit for x in item)]

[[1, 1, 3, 4], [2, 4, 4]]

此方法与@alecxe(或@scar L López)的解决方案的主要区别在于,all短路,并且不会在内存中创建任何集合或列表,而set intersection返回一个新集合,该集合包含与omit集合共同的所有项,并且检查它的长度以确定是否有任何项是公共的或不是(set intersection在内部以C速度发生,因此它比all中使用的普通python循环更快)

时间比较:

^{pr2}$

没有项目相交:>>> omit = set(random.randrange(1, 10**18) for _ in xrange(100000))

>>> full_list = [[random.randrange(10**19, 10**100) for _ in xrange(100)] for _ in xrange(1000)]

>>> %timeit [item for item in full_list if not omit & set(item)]

10 loops, best of 3: 43.3 ms per loop

>>> %timeit [x for x in full_list if not omit.intersection(x)]

10 loops, best of 3: 28 ms per loop

>>> %timeit [item for item in full_list if all(x not in omit for x in item)]

10 loops, best of 3: 65.3 ms per loop

所有项目相交:>>> full_list = [range(10**3) for _ in xrange(1000)]

>>> omit = set(xrange(10**3))

>>> %timeit [item for item in full_list if not omit & set(item)]

1 loops, best of 3: 148 ms per loop

>>> %timeit [x for x in full_list if not omit.intersection(x)]

1 loops, best of 3: 108 ms per loop

>>> %timeit [item for item in full_list if all(x not in omit for x in item)]

100 loops, best of 3: 1.62 ms per loop

有些项目相交:>>> omit = set(xrange(1000, 10000))

>>> full_list = [range(2000) for _ in xrange(1000)]

>>> %timeit [item for item in full_list if not omit & set(item)]

1 loops, best of 3: 282 ms per loop

>>> %timeit [x for x in full_list if not omit.intersection(x)]

1 loops, best of 3: 159 ms per loop

>>> %timeit [item for item in full_list if all(x not in omit for x in item)]

1 loops, best of 3: 227 ms per loop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值