Skip to content

Python 列表间相减

EricCml edited this page Jan 4, 2022 · 1 revision

Python 列表间相减

摘要

要根据一个list里面的元素删除另一个list中的对应的元素,用了几种不同的方法,记录总结一下

问题描述

假设我有这样两个list:

  • 一个是list1

    list1 = [1, 2, 3, 4, 5]
  • 一个是list2

    list2 = [1, 4, 5]
  • 我们如何得到一个新的list,list3

    list3 = [2, 3]

list3中包括所有不在list2中出现的list1中的元素。

即:list3 = list1 - list2(数学意义上的求集合差集)

几种解决方案

1. filter函数

filter(function, iterable)

其中,function 为函数,iterable 为序列

函数可以单独写,也可以直接写在 filter 里面。

注意:filter 是一个generator,所以要把输出转换成 list 来查看得到的结果

need_issue_number = list(filter(lambda x: x not in already_issue_number, issue_number_list))
# 输出:Get done in 8.4367375 seconds

2. for循环逐一判断

复杂写法:

need_issue_number = []
for x in issue_number_list:
    if x not in already_issue_number:
        need_issue_number.append(x)
# 输出:Get done in 8.5331984 seconds

简洁写法:

need_issue_number = [x for x in issue_number_list if x not in already_issue_number]
# 输出:Get done in 8.3064038 seconds

3. 求set集合差集

# 求集合差集:第一种写法,直接相减
need_issue_number = list(set(issue_number_list) - set(already_issue_number))
# 求集合差集:第二种写法,使用difference函数
need_issue_number = list(set(issue_number_list).difference(set(already_issue_number)))
# 列表排序
need_issue_number.sort()
# 输出:Get done in 0.0031899999999999984 seconds

原理:set(集合)中重复的项会被删除

总结

在列表很大时,第三种方式最快,而且领先其他两种方式很多