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

最近突然有个需求(取两个文件数据的交集),数据量非常大(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 = 0
    for i in intersection_list:
        num += 1
        f.write(i)
        print("第%s个保存完成"%num)
print("保存文件结束!!!")

三、运行结果展示

可以看到800多万和300多万对比只用了6秒多(实际时间可能会根据电脑性能出现小误差)
在这里插入图片描述

posted @ 2019-10-24 20:11  程序猿杂记  阅读(288)  评论(0)    收藏  举报