(itertools的使用)Python一行代码去除两列表中出现的重复项

(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))

解法二(即解法一的原理)

# ------自定义函数------
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对象。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页