最近突然有个需求(取两个文件数据的交集),数据量非常大(2000多万行的数据),最开始的思路是先取一个文件所有的数据,保存成一个列表,然后判断是否在另一个文件中,花了十几分钟写出来后,一运行,差点崩溃,太慢了。然后想到数学里的列表取交集,百度一下,果然有,测试了一下,速度非常快,完美的解决问题。

一、核心代码

:先把列表用set转换成集合然后在取交集、并集和差集

  1. 两个列表取交集

    list_1 = [1,2,3]
    list_2 = [2,3,4]
    print(list(set(list_1) & set(list_2)))
    print(list(set(list_1).intersection(set(list_2))))
    
    #结果
    [2, 3]
    [2, 3]
    
  2. 两个列表取并集

    list_1 = [1,2,3]
    list_2 = [2,3,4]
    print(list(set(list_1) | set(list_2)))
    print(list(set(list_1).union(set(list_2))))
    
    #结果
    [1, 2, 3, 4]
    [1, 2, 3, 4]
    
  3. 两个列表取差集

    注:下述两个方法效果不一样

    list_1 = [1,2,3]
    list_2 = [2,3,4]
    print(list(set(list_1) ^ set(list_2))) #两个列表取差集
    print(list(set(list_1).difference(set(list_2)))) #list_1中有而list_2中没有的
    
    #结果
    [1, 4]
    [1]
    

二、小工具

注:

  1. 每个文件的数据都是每行一条
  2. 此工具比较消耗内存(不过影响不大)
file_1_path = "./file_1.txt" #文件_1路径
file_2_path = "./file_2.txt"  #文件_2路径
result_path = "./result.txt" #结果文件路径#把文件_1中的数据读取成列表file_1_list
with open(file_1_path, 'r', encoding='utf-8') as file_1_data:file_1_list = file_1_data.readlines()#把文件_2中的数据读取成列表file_2_list
with open(file_2_path, 'r', encoding='utf-8') as file_2_data:file_2_list = file_2_data.readlines()#两个列表取交集(并集或差集只需修改此处即可)
intersection_list = list(set(file_1_list) & set(file_2_list))#保存结果文件
with open(result_path,'a', encoding='utf-8') as f:num = 0for i in intersection_list:num += 1f.write(i)print("第%s个保存完成"%num)
print("保存文件结束!!!")

三、运行结果展示

可以看到800多万和300多万对比只用了6秒多(实际时间可能会根据电脑性能出现小误差)

Python-两个列表取交集、并集、差集(编写了一个两个文件取交集的小工具)相关推荐

  1. go自定义和使用set包处理列表 交集 并集 差集

    自定义交集 并集 差集 package mainimport "fmt"func main() {aList := []string{"1", "2& ...

  2. python 数组 交集 并集 差集

    python 数组 交集 并集 差集 1.交集 a = [1, 3, 5] b = [2, 3, 4] print(set(a).intersection(set(b))) print(set(a) ...

  3. oracle 并集 时间_Oracle集合运算符 交集 并集 差集

    集合运算符:UNION/UNION ALL 并集,INTERSECT 交集,MINUS 差集 一.union求并集,公共部分只有包含一次 例:求emp表ename中含'A'或含有'M' SQL> ...

  4. sort求交集并集差集

    uniq -u    取出只出现过一次的元素,用来求差集 uniq -c     group by uniq -d     取出出现次数大于等于2的元素,用来求交集 sort 1 2 和cat 1 2 ...

  5. lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

  6. 采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

  7. MySQL求交集 并集 差集

    MySQL求交集 并集 差集 交集 两个表之间相同的 并集 两个表之间的总和 ps: union 自带去重 差集 两个表直接的差值

  8. JAVA Hashset求集合的交集并集差集

    JAVA Hashset求集合的交集并集差集 Hashset是Set接口较为常见的一个子类,该子类的最大特点是不允许保存重复的元素,并且所有的内容都采用散列(无序)的方式进行存储. package c ...

  9. A和B 单链表表示 集合,求其 交集 并集 差集

    A和B 单链表表示 集合的 交集 并集 差集 /* A和B 单链表表示 集合的 交集 并集 差集 */ //#include <iostream> //using namespace st ...

  10. spark之交集并集差集拉链

    spark之交集并集差集拉链 def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setMaster(&qu ...

最新文章

  1. Next.js 7发布,构建速度提升40%
  2. 理论基础 —— 栈 —— 链栈
  3. Linux安装JDK(rpm)
  4. MessageDigest简介
  5. linux多线程加解锁
  6. vue内容横向循环滚动_Vue替代marquee标签超出宽度文字横向滚动效果
  7. ubuntu环境搭建五:修改中文字符集
  8. openresty的安装和使用
  9. Linux查看和剔除当前登录用户-转
  10. Andrew Ng机器学习公开课笔记 -- 朴素贝叶斯算法
  11. Nacos教程_2 讲解
  12. 飞凌单片机解密_干货:芯片解密方法大全
  13. html 滑动刻度尺,js实现移动端H5页面手指滑动刻度尺功能
  14. 南京旅游迈入大数据时代
  15. 论文阅读《UV-SLAM: Unconstrained Line-Based SLAM Using Vanishing Points for Structural Mapping》R-AL 2022
  16. 怎么办?不到 20 人的 IT 公司我该去吗?
  17. Tableau参数:自定义周起始时间
  18. 计算机专业的短期计划范文,制定计算机学习计划范文3篇
  19. Homa: A Receiver-Driven Low-Latency Transport Protocol Using Network Priorities(Sigcomm'18) 论文记录
  20. 哈希表解决冲突的两种方式

热门文章

  1. Android中设置定时闹钟以及AlarmManager详解
  2. PPPcloud云主机免费送!
  3. 服务器维护稀有宝宝,完美国际的中的稀有宝宝
  4. Word2013写CSDN博客
  5. 朕对兄弟连的一些看法
  6. python二级题库最新
  7. 网传!微信监听用户聊天记录
  8. 大数据应用电子商务之精准推广
  9. Spring系列之FactoryBean(一)
  10. 滥用线程,导致线上线程池被撑爆的一次意外