如何在 Python 中刪除列表中的重複資料
Aliaksei Yursha
2023年1月30日
有時在 Python 中,我們有列表中的值,其中一些是重複的。我們需要從列表中刪除所有重複項,以便列表中的所有值都是唯一的。
我們可以使用不同的方法來實現這一點,其中一些方法可以保留元素的原始順序,而其他方法則不能。
對列表進行重複資料刪除而不保留順序
如果不需要保留原始順序,則可以使用內建集合 set
資料結構對列表進行重複資料刪除。set
作為資料結構,在設計上保證內部元素都是唯一的。
通過從我們的初始列表構造集合 set
,所有重複元素都將被忽略。然後,我們可以將集合轉換回列表,並獲得唯一元素的列表。
遺憾的是,元素的順序改變了,因為 set
資料結構的重複資料刪除功能是使用雜湊表實現的,雜湊表不記得首先插入哪個元素。
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']
如果將 NumPy 庫用於 Python 中的科學計算,則也可以使用 numpy.unique()
函式。
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']
請注意,上述方法也不會保留原始元素順序。保留順序的 NumPy
方式更多,你可以在下面找到。
使用保留順序對列表進行重複資料刪除
一種允許保留初始順序的簡單解決方案是使用雙 for-each
迴圈。
第一個迴圈遍歷原始列表的所有元素。第二個迴圈檢查我們是否已經遍歷到具有相同值的元素。
如果還沒有,則將其新增到 unique
列表中,最後將按原始順序包含唯一元素。
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names: # 1st loop
... if name not in unique: # 2nd loop
... unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
在保留原始順序的同時對列表進行重複資料刪除的另一種方法是使用 collections.OrderedDict
資料結構。OrderedDict
是 Python 中一種特殊的字典資料結構,它可以記住鍵插入的順序。
>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
如果你使用 Python Pandas 資料分析庫,也可以用 pandas.unique
函式。此方法是保留順序的。
>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']
NumPy 在保留順序的同時對列表進行重複資料刪除的方法要複雜一些。你必須記住每個不同元素的索引,然後使用此類索引從原始元素重新建立一個唯一列表。
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']