这几天多次遇到数据去重的问题,所以打算整理一下几种不同类型的数据去重的方法(这里主要汇总Python列表、字典、Excel、数据库的MySQL以及Pandas的Dataframe),暂不更新Leetcode数据库的题解。

  • Python列表、字典去重
  1. 看下面这个例子和第一种解法set()
a = [5, 6, 2, 2, 1, 2, 3,  3, 6, 9, 9]

print(list(set(a)))
#下面是运行后的结果
>>>>>[1, 2, 3, 5, 6, 9]

使用set方法应该是列表去重最简单高效的方法,它利用了集合中的元素不能重复的特性,即唯一性 这个特点来对列表去重,但是打乱了原始列表的顺序

  1. 第二种解法,使用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]

具体的原理可以查看官方文档

  1. 第三种解法循环筛选:
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]

可以看出来第三种方法好在去重的同时保留了原始列表的顺序!

  1. 第四种解法,使用字典的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,这个方法依旧可以保留了原始列表的顺序

  1. 第五种解法,使用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]

该方法的原理也可以查看官方文档,同样保留了原始列表的顺序。

  1. 当然掌柜看到有的博客还写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]

(未完待续。。。)