2024-04-23 16:01:53 发布
网友
假设我有两个列表,l1和l2。我想执行l1 - l2,它返回不在l2中的l1的所有元素。
l1
l2
l1 - l2
我可以想出一个简单的循环方法来做这件事,但这将是非常低效的。什么是一个Python和有效的方式来做这件事?
例如,如果我有l1 = [1,2,6,8] and l2 = [2,3,5,8],那么l1 - l2应该返回[1,6]
l1 = [1,2,6,8] and l2 = [2,3,5,8]
[1,6]
Python有一个名为List Comprehensions的语言特性,非常适合让这类事情变得非常简单。下面的语句完全符合您的要求,并将结果存储在l3:
l3
l3 = [x for x in l1 if x not in l2]
l3将包含[1, 6]。
[1, 6]
扩展Donut的答案和这里的其他答案,您可以通过使用生成器理解而不是列表理解,并通过使用set数据结构(因为in运算符在列表上是O(n),而在集合上是O(1))来获得更好的结果。
set
in
下面是一个对你有用的函数:
def filter_list(full_list, excludes): s = set(excludes) return (x for x in full_list if x not in s)
结果将是一个iterable,它将懒洋洋地获取过滤后的列表。如果您需要一个真正的list对象(例如,如果您需要对结果进行len()),那么您可以轻松地构建一个这样的列表:
len()
filtered_list = list(filter_list(full_list, excludes))
一种方法是使用集合:
>>> set([1,2,6,8]) - set([2,3,5,8]) set([1, 6])
Python有一个名为List Comprehensions的语言特性,非常适合让这类事情变得非常简单。下面的语句完全符合您的要求,并将结果存储在
l3
:l3
将包含[1, 6]
。扩展Donut的答案和这里的其他答案,您可以通过使用生成器理解而不是列表理解,并通过使用
set
数据结构(因为in
运算符在列表上是O(n),而在集合上是O(1))来获得更好的结果。下面是一个对你有用的函数:
结果将是一个iterable,它将懒洋洋地获取过滤后的列表。如果您需要一个真正的list对象(例如,如果您需要对结果进行
len()
),那么您可以轻松地构建一个这样的列表:一种方法是使用集合:
相关问题 更多 >
编程相关推荐