Python如何去重

import csv  
  
# 创建临时文件temp.csv找出所需要的列  
temp_file = open("temp.csv", "w", newline='')  # 如果不指定newline='',则每写入一行将有一空行被写入  
temp_csv_writer = csv.writer(temp_file, dialect="excel")  
# 读取input.csv文件,此时只有指定的一列数据  
with open('input.csv') as file:  
    temp_readcsv = csv.reader(file, delimiter=',')  
    for row in temp_readcsv:  # 取出input.csv所有列数据  
        temp = [row[3]]  # 得到指定列数据  
#        print(row[3])  #print()打印input.csv文件中第3列所有数据  
        temp_csv_writer.writerow(temp)  # 第3列每行数据循环写入temp.csv文件中  
temp_file.close()  
  
# 在临时文件基础上匹配所要找的数据,计算出次数生成out.csv文件  
out1 = []  # 新建数组来保存指定列的每行数据  
out_time = []  # 新建数组来保存指定列的每行数据出现的次数  
out_file = open("out.csv", "w", newline='')  # 如果不指定newline='',则每写入一行将有一空行被写入  
out_csv_writer = csv.writer(out_file, dialect="excel")  
out_csv_writer.writerow(["ID", "TIMES"])  # 写入标题 数据,出现次数  
# 读取temp.csv文件,此时只有指定的一列数据  
with open('temp.csv') as file2:  
    out_readcsv = csv.reader(file2, delimiter=',')  
    for St in out_readcsv:  # 循环取出列的每行数据  
        out1.append(St)  # append()将列的每行数据变为out1链表(list)的后续增加的元素,即将列数据变为一维数组。  
    print(out1)    # 打印out1[n]的第n个元素,即原列的第n行元素  
  
# list的迭代其实是以list中项的序列号来遍历的,不会因为list的的改变而改变,  
# 永远都是按照序号的0,1,2...遍历。当删除其中某一项时,它之后的每一项的序列号各往前移一项.  
# 当遍历list时,若发现0项是重复项(因为内嵌函数均处理第一个发现项),于是将其移除。当移除0项时,  
# 原来的1项变为0项,以此类推。此时list迭代由1开始(0项已过),但此时的1项是原list的2项,这样子就漏掉原list的1项!  
    # 可以将list反转来进行删除操作,其本质就是放当发现某项具有重复项时,就从后往前删除。  
    # 比如迭代0项发现1项是它的重复项,那么就删除1项,删除1项后2项变1项,而此时list迭代正则到了1项。  
    # 从原始list的角度上来说,就跳过了1项。但是它却不影响去重,因为它跳过的是重复项。  
    # list的不重复迭代反而使去重效率更高且不会漏掉不重复项。因此原始list直接去重的核心问题不是迭代的漏项,而是迭代不能漏掉不重复项。  
    for i in out1:  
        a = out1.count(i)  # 取元素  
        out_time.append(a)  # 得到出现的次数  
#        print(i, a)  
        if a > 1:  
            out1.reverse()  # 将list反转来进行删除操作  
            for k in range(1, a):  
                out1.remove(i)  # 从后往前删除直到最前面的第一个为止,这样即删除了后面的,又保留了第一个!  
            out1.reverse()  # 将list再反转回来,保证下次循环又是从原始顺序来删除  
    print(out1)  # 此时out1链表(list)即去重后的list  
    print(out_time)  # 元素出现的次数  
    for j in range(len(out1)):  # len()得到out1链表元素个数,依此作为time[]查找下标  
        out_row = [out1[j], out_time[j]]   # 取元素和对应的次数  
        out_csv_writer.writerow(out_row)  # 写入out.csv文件里  
out_file.close()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值