从下一个列表中删除一个列表中出现的所有元素

2024-04-23 16:01:53 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个列表,l1l2。我想执行l1 - l2,它返回不在l2中的l1的所有元素。

我可以想出一个简单的循环方法来做这件事,但这将是非常低效的。什么是一个Python和有效的方式来做这件事?

例如,如果我有l1 = [1,2,6,8] and l2 = [2,3,5,8],那么l1 - l2应该返回[1,6]


Tags: and方法元素l1列表方式l2
3条回答

Python有一个名为List Comprehensions的语言特性,非常适合让这类事情变得非常简单。下面的语句完全符合您的要求,并将结果存储在l3

l3 = [x for x in l1 if x not in l2]

l3将包含[1, 6]

扩展Donut的答案和这里的其他答案,您可以通过使用生成器理解而不是列表理解,并通过使用set数据结构(因为in运算符在列表上是O(n),而在集合上是O(1))来获得更好的结果。

下面是一个对你有用的函数:

def filter_list(full_list, excludes):
    s = set(excludes)
    return (x for x in full_list if x not in s)

结果将是一个iterable,它将懒洋洋地获取过滤后的列表。如果您需要一个真正的list对象(例如,如果您需要对结果进行len()),那么您可以轻松地构建一个这样的列表:

filtered_list = list(filter_list(full_list, excludes))

一种方法是使用集合:

>>> set([1,2,6,8]) - set([2,3,5,8])
set([1, 6])

相关问题 更多 >