(itertools的使用)Python一行代码去除两列表中出现的重复项
itertools — 为高效循环而创建迭代器的函数
以下内容摘自官方文档-----filterfalse函数的用法:
itertools.filterfalse(predicate, iterable)
创建一个迭代器,只返回 iterable 中 predicate 为 False 的元素。如果 predicate 是 None,返回真值测试为false的元素。大致相当于:
def filterfalse(predicate, iterable):
# filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
if predicate is None:
predicate = bool
for x in iterable:
if not predicate(x):
yield x
需求
列表list_a:[1, 2, 3, 4, 5, 111, 222, 555, 21]
列表list_b:[3, 222, 555]
去除出现在列表a中,列表b的元素,即获得结果:[1, 2, 4, 5, 111, 21]
解决
定义两列表
# 列表a ----->[1, 2, 3, 4, 5, 111, 222, 555, 21]
list_a = [1, 2, 3, 4, 5, 111, 222, 555, 21]
# 列表b----->[3, 222, 555]
list_b = [3, 222, 555]
解法一
import itertools
# 结果----->[1, 2, 4, 5, 111, 21]
result_list = list(itertools.filterfalse(lambda x: x in list_b, list_a))
# 除此之外,也可用内置的filter()函数,免去iterstools的导入
# 需要修改一下相反的判断条件,结果是一样的
result_list = list(filter(lambda x: x not in list_b, list_a))
解法二(即解法一的原理)
# ------自定义函数------
def filter(list_a, list_b):
for x in list_a:
if x not in list_b:
yield x
result_list = list(filter(list_a, list_b))
解法三
# ------循环写法------
result_list = []
for x in list_a:
if x not in list_b:
result_list.append(x)
简单说两句
根据官方文档中的注释:
filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
可以清晰地看出传入的iterable参数(“range(10)”)即一可迭代对象,里的元素会被循环传递入predicate参数(“lambda x: x%2”)即自定义的表达式,中作为表达式的参数进行判断,判断表达式的结果为False时,该元素就会被yield出。
因为filterfalse函数结束后返回的是一个迭代器对象,则需在结果加上list()将其转为List对象。