HOWTO · Python

如何在 Python 中從列表中獲取唯一值

本文介紹了用 Python 從列表中獲取唯一值的方法。

本頁內容

在 Python 3.7 及更新版本中,若清單元素可雜湊,且你想保留各值首次出現的順序,請使用 list(dict.fromkeys(values)) 取得不重複的值。若元素不可雜湊,請改用迴圈建立結果清單。只有在順序不重要時,才轉換為 set(values)。

使用 dict.fromkeys() 依序取得不重複的值

dict.fromkeys() 會建立一個字典,其鍵來自輸入的可疊代物件。字典的鍵不會重複;Python 3.7 及更新版本也保證字典會保留插入順序。因此,將鍵轉回清單即可移除重複值,同時保留每個值首次出現的位置。這個方法要求每個元素都可雜湊,這也是字典鍵的一般要求。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

values = ["pear", "apple", "pear", "plum", "apple"]
unique_values = list(dict.fromkeys(values))
print(unique_values)

輸出:

['pear', 'apple', 'plum']

使用迴圈依序取得不重複的值

若值不可雜湊,例如巢狀清單,字典或集合就無法將它們作為鍵或成員。改用明確的迴圈,逐一比較每個值與已收集的值即可。這樣會保留每個值首次出現的位置,也適用於相等比較有意義的值清單。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

values = [[1, 2], [3, 4], [1, 2]]
unique_values = []
for value in values:
    if value not in unique_values:
        unique_values.append(value)
print(unique_values)

每次執行 value not in unique_values 都會搜尋結果清單。不同項目的數量增加時,反覆比較可能讓這個方法比雜湊式方法慢。因此,當支援不可雜湊的元素比速度更重要時,才使用這種方法。

順序不重要時,使用 set() 取得不重複的值

若元素可雜湊,使用 set(values) 就能簡潔地移除重複值。集合不會保留輸入清單的順序,因此轉回清單時,請勿依賴特定的排列順序。集合中的元素也必須可雜湊。當順序無關緊要時,例如檢查成員資格或比較包含哪些值,可以使用這個方法。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

values = ["pear", "apple", "pear", "plum", "apple"]
unique_values = set(values)
print(unique_values)

顯示出的集合順序可能不同;結果包含不重複的值,但不保證特定的輸出順序。

如何為你的清單選擇方法

若要取得簡潔的結果清單,並保留每個可雜湊值首次出現的位置,請使用 dict.fromkeys()。若值可能不可雜湊,例如清單,而且仍須保留首次出現的順序,請使用明確的迴圈。若值可雜湊且順序無關緊要,則使用 set()。

對於可雜湊的輸入,字典和集合的成員資格檢查平均而言通常有效率;迴圈則會反覆搜尋不斷增長的結果清單。這些方法會依據 Python 的相等與雜湊行為判定重複值:1 和 True 等相等的值會被視為相同,並合併為一個項目。如果你的應用程式需要以不同方式判定唯一性,請先正規化每個項目,或為其產生鍵,再依該鍵移除重複值。