Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从列表中删除元素列表?_Python_List - Fatal编程技术网

Python 如何从列表中删除元素列表?

Python 如何从列表中删除元素列表?,python,list,Python,List,假设有列表A和B: 我想修改一个,使其成为 A = [1, 3, 5, 7, 8, 9, 10] 我不想使用remove,因为使用列表可以有10k个数字: A = [x for x in A if x not in B] 如果您的用例允许;您可以使用集操作,这是非常高效的: >>> A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> B = [2, 4, 6] >>> A = list(set(A) - set

假设有列表A和B:

我想修改一个,使其成为

A = [1, 3, 5, 7, 8, 9, 10]

我不想使用remove,因为使用列表可以有10k个数字:

A = [x for x in A if x not in B]

如果您的用例允许;您可以使用集操作,这是非常高效的:

>>> A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> B = [2, 4, 6]
>>> A = list(set(A) - set(B))
>>> A
[1, 3, 5, 7, 8, 9, 10]
请注意,这将不会使A保持相同的顺序,并将从中删除所有重复项

一种较慢较快的方法是使用列表理解,这种方法可以在一个列表中保留重复项并保持其顺序。但是,首先将B转换为集合以使in操作尽可能快,这一点至关重要:

>>> A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> B = [2, 4, 6]
>>> set_b = set(B)
>>> A = [n for n in A if n not in set_b]
[1, 3, 5, 7, 8, 9, 10]
编辑:集合查找的列表理解实际上是更快的解决方案:

$ python3 -m timeit --number=1000 --setup='import random; A = random.sample(range(10 ** 6), 10 ** 5); B = random.sample(range(10 ** 6), 10 ** 4)' 'list(set(A) - set(B))'
1000 loops, best of 5: 18.7 msec per loop

A是否总是排序?排序与否都很好,只是为了从A中删除B中的元素。你确定删除速度太慢吗?顺便说一句,你被否决了,因为你自己甚至没有尽到解决问题的最小努力。StackOverflow是为了帮助您,而不是为您提供完整的解决方案。但它也有副作用,即删除重复项elements@WasifHasan但这似乎与问题相符?不清楚。@托马斯考虑一个示例集[1,2 1] -集合[2 ],这里预期的输出应该是{1,1},但是它将删除重复,所以返回{ 1 },这样是不是不正确?谢谢!我试过了,它很有效率,使用起来也很好thanks@WasifHasan可能是删除重复项很好。@WasifHasan但这应该与重复调用remove具有相同的复杂性?@Thomas时间复杂性很差,我无法提供更好的解决方案,除了已覆盖的集合。如果对A进行排序,您可以使用二进制搜索,从On·m到Ologn·m,但集合的速度会更快:但再次强调,集合的功能与列表的功能不完全相同,正如您在对另一个答案的评论中所示。
$ python3 -m timeit --number=1000 --setup='import random; A = random.sample(range(10 ** 6), 10 ** 5); B = random.sample(range(10 ** 6), 10 ** 4)' 'list(set(A) - set(B))'
1000 loops, best of 5: 18.7 msec per loop
$ python3 -m timeit --number=1000 --setup='import random; A = random.sample(range(10 ** 6), 10 ** 5); B = random.sample(range(10 ** 6), 10 ** 4)' 'set_b = set(B); [n for n in A if n not in set_b]'
1000 loops, best of 5: 11.8 msec per loop