這幾天多次遇到數據去重的問題,所以打算整理一下幾種不同類型的數據去重的方法(這裏主要彙總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]
(未完待續。。。)