数据去重的各种方法汇总(一)
这几天多次遇到数据去重的问题,所以打算整理一下几种不同类型的数据去重的方法(这里主要汇总Python列表、字典、Excel、数据库的MySQL以及Pandas的Dataframe),暂不更新Leetcode数据库的题解。
-
Python列表、字典去重
- 看下面这个例子和第一种解法set():
a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] print(list(set(a))) #下面是运行后的结果 >>>>>[1, 2, 3, 5, 6, 9]
使用set方法应该是列表去重最简单高效的方法,它利用了集合中的元素不能重复的特性,即唯一性 这个特点来对列表去重,但是打乱了原始列表的顺序!
- 第二种解法,使用Python内置模块itertools的groupby方法,也不会保留原列表的顺序:
import itertools a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] a.sort() b = itertools.groupby(a) print(list(x for x, y in b)) >>>>>[1, 2, 3, 5, 6, 9]
具体的原理可以查看。
- 第三种解法循环筛选:
a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] b = [] for item in a: if item not in b: b.append(item) print(b) >>>>>[5, 6, 2, 1, 3, 9]
可以看出来第三种方法好在去重的同时保留了原始列表的顺序!
- 第四种解法,使用字典的fromkeys()方法:
a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] b = dict.fromkeys(a).keys() print(list(b)) >>>>>[5, 6, 2, 1, 3, 9]
该方法是利用字典的fromkeys()方法,然后取keys转换成list格式。这个方法还有下面这种变形写法:
a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] b = dict.fromkeys(a) print(list(x for x in b)) >>>>>[5, 6, 2, 1, 3, 9]
就是利用列表推导式来生成去重后的list,这个方法依旧可以保留了原始列表的顺序!
- 第五种解法,使用lambda匿名函数和reduce函数(该方法也可以去除列表里面字典的多个重复值):
from functools import reduce a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] func = lambda x, y : x if y in x else x + [y] a = reduce(func, [[], ] + a) print(a) >>>>>[5, 6, 2, 1, 3, 9]
该方法的原理也可以查看,同样保留了原始列表的顺序。
- 当然掌柜看到有的博客还写sort函数/sorted函数去重,但是掌柜觉得本质还是利用了set的特性!
a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] list2 = list(set(a)) list2.sort(key=a.index) print(list2) >>>>>[5, 6, 2, 1, 3, 9]
或者这么写:
a = [5, 6, 2, 2, 1, 2, 3, 3, 6, 9, 9] b = sorted(set(a), key=a.index) print(b) >>>>>[5, 6, 2, 1, 3, 9]