數據去重的各種方法彙總(一)

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

(未完待續。。。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章