这几天多次遇到数据去重的问题,所以打算整理一下几种不同类型的数据去重的方法(这里主要汇总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]
(未完待续。。。)