(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))
# 除此之外,也可用内置的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对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值