Python-两个列表取交集、并集、差集(编写了一个两个文件取交集的小工具)
最近突然有个需求(取两个文件数据的交集),数据量非常大(2000多万行的数据),最开始的思路是先取一个文件所有的数据,保存成一个列表,然后判断是否在另一个文件中,花了十几分钟写出来后,一运行,差点崩溃,太慢了。然后想到数学里的列表取交集,百度一下,果然有,测试了一下,速度非常快,完美的解决问题。
一、核心代码
注:先把列表用set转换成集合然后在取交集、并集和差集
-
两个列表取交集
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] -
两个列表取并集
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] -
两个列表取差集
注:下述两个方法效果不一样
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]
二、小工具
注:
- 每个文件的数据都是每行一条
- 此工具比较消耗内存(不过影响不大)
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秒多(实际时间可能会根据电脑性能出现小误差)


浙公网安备 33010602011771号