Python新手必看!完整指南教你移除列表重複項目【含保留順序教學】

1. 為什麼需要在 Python 中移除列表的重複項目?

在 Python 中移除列表中的重複項目在許多情況下都非常重要。特別是在處理大量資料時,為了確保資料的唯一性並進行高效的處理,這是一項不可或缺的操作。

需要刪除重複項目的原因

  1. 提升資料分析的準確性
    在資料分析中,如果包含重複的資料,可能會導致結果不準確。例如,在統計銷售數據或問卷結果時,重複項可能會導致錯誤的結論。
  2. 與資料庫整合
    當使用 Python 將資料匯入資料庫時,如果唯一鍵重複,會產生錯誤。事先使用 Python 移除重複項目,可以讓資料處理流程更加順利。
  3. 提高處理效率
    資料過於龐大會對記憶體與處理時間造成負擔。特別是在處理大量資料時,移除重複可以有效改善整體系統效能。

常見的重複刪除使用情境

  • 資料清理:整理從網頁爬蟲取得的資料時。
  • 重複檢測:例如商品庫存清單或用戶註冊資訊的重複確認。
  • 列表操作:需要在特定的列表處理中刪除重複資料時。

本文的目的

本篇文章將介紹如何使用 Python 移除列表中的重複項目,從基礎方法到進階技巧都有所涵蓋。內容適合初學者,並包含保留順序與效能優化的方法,幫助讀者根據自身需求選擇最適合的方式。

2. 使用 set 移除列表中的重複項目

在 Python 中,最基本的重複刪除方法就是使用 setset 是 Python 的內建資料型態,具有「不允許重複」的特性。透過這個特性,可以輕鬆地刪除列表中的重複元素。

基本程式碼範例

以下程式碼示範如何刪除列表中重複的元素,並建立一個只包含唯一值的新列表。

# 原始列表
my_list = [1, 2, 2, 3, 4, 4, 5]

# 使用 set 移除重複
unique_list = list(set(my_list))

print(unique_list)  # 結果: [1, 2, 3, 4, 5]

執行結果與動作說明

  • 輸入[1, 2, 2, 3, 4, 4, 5]
  • 輸出[1, 2, 3, 4, 5](重複的 24 已被移除)

此程式碼中,透過將列表轉換為 set,可以自動移除重複元素。接著再使用 list() 函數將 set 轉換回列表。

使用 set 的優點

  1. 簡單直觀
    程式碼簡潔明瞭,初學者也能輕鬆理解。
  2. 處理速度快
    由於 set 的特性,可高效執行重複刪除。

使用 set 時需注意的事項

原始列表的順序不會被保留
請看以下範例。

# 原始列表
my_list = [4, 3, 4, 2, 1]

# 使用 set 移除重複
unique_list = list(set(my_list))

print(unique_list)  # 結果: [1, 2, 3, 4]

如上例所示,使用 set 會導致列表中的元素順序被打亂。因此,在順序重要的情況下,需要考慮使用其他方法。

適合使用 set 的情境

  • 當資料的順序不重要時。
  • 需要簡單且快速處理資料時。

下一節將說明如何在保留順序的情況下進行重複刪除。

3. 保留順序的情況下刪除重複項目的方法

當你在使用 Python 刪除列表中的重複項目時,若希望保留原始順序,那麼使用 set 就無法達成。這一節將介紹保留順序同時刪除重複項目的其他方法,包括使用 dict.fromkeys()OrderedDict

使用 dict.fromkeys() 的方法

自 Python 3.6 起,dict(字典型別)會保留插入順序。利用這個特性,我們可以在刪除重複的同時保留原來的順序。

實際程式碼範例

# 原始列表
my_list = [4, 3, 4, 2, 1]

# 使用 dict.fromkeys() 移除重複
unique_list = list(dict.fromkeys(my_list))

print(unique_list)  # 結果: [4, 3, 2, 1]

執行結果與說明

  • 輸入[4, 3, 4, 2, 1]
  • 輸出[4, 3, 2, 1]
    此程式中使用 dict.fromkeys(),將列表元素作為字典的 key,因為 key 不允許重複,自動完成重複刪除。接著再將 key 轉換成列表,即可保留順序。

優點

  1. 順序得以保留
    在保留原始順序的同時完成重複刪除。
  2. 程式碼簡潔
    只需一行即可完成重複刪除與順序保持。

缺點

  • 若對字典的運作原理不熟悉,初學者可能會覺得有點困難。

使用 OrderedDict 的方法

另一種方式是使用 collections 模組中的 OrderedDict,這也可以在保留順序的情況下刪除重複項目。

實際程式碼範例

from collections import OrderedDict

# 原始列表
my_list = [4, 3, 4, 2, 1]

# 使用 OrderedDict 移除重複
unique_list = list(OrderedDict.fromkeys(my_list))

print(unique_list)  # 結果: [4, 3, 2, 1]

執行結果與說明

OrderedDict 與一般字典一樣不允許重複 key,但同時保留插入順序。與 dict.fromkeys() 類似,但在不同版本的 Python 中都能穩定運作。

優點

  1. 高度相容性
    即使在 Python 3.6 以下版本也能保留順序。
  2. 穩定可靠
    專為順序保持而設計,更具可預測性。

缺點

  • 需要匯入標準函式庫。
  • 相較於 dict.fromkeys(),語法略顯複雜。

效能比較

以下是使用 dict.fromkeys()OrderedDict 時的效能比較。

程式碼範例

import time
from collections import OrderedDict

# 大量資料
large_list = [i for i in range(100000)] + [i for i in range(100000)]

# 使用 dict.fromkeys()
start = time.time()
unique_list1 = list(dict.fromkeys(large_list))
print(f"dict.fromkeys() 的處理時間: {time.time() - start:.6f} 秒")

# 使用 OrderedDict
start = time.time()
unique_list2 = list(OrderedDict.fromkeys(large_list))
print(f"OrderedDict 的處理時間: {time.time() - start:.6f} 秒")

結果(範例)

dict.fromkeys() 的處理時間: 0.014561 秒
OrderedDict 的處理時間: 0.018437 秒
  • dict.fromkeys() 的速度稍快。
  • OrderedDict 適合需要高相容性或特定環境下使用。

適合使用這些方法的情境

  1. 當需要保留原始順序時。
  2. 希望同時完成順序保持與重複刪除。
  3. 考慮 Python 版本或未來相容性時。

4. 進階的列表重複刪除技巧

有些情況下,基本的重複刪除方法無法處理更複雜的資料結構,例如二維列表或條件式的刪除。在這一節,我們將介紹如何處理這些進階情況。

年収訴求

5. 性能比較

在 Python 中移除列表重複項目的方法不同,處理速度與記憶體使用量也會有所差異。本節將比較幾種常見方法的性能表現,並探討適用的場景。

比較對象與評估標準

比較的方法包括:

  1. 使用 set 的方法
  2. 使用 dict.fromkeys() 的方法
  3. 使用 OrderedDict 的方法

評估標準包括:

  • 處理速度(根據資料量測試執行時間)
  • 記憶體使用量(在大量資料處理時的效率)

實際程式碼的效能測試

以下程式碼將測試各種方法在處理大規模資料時的效率。

效能測試程式碼範例

import time
from collections import OrderedDict

# 建立大型資料集
large_list = [i for i in range(100000)] + [i for i in range(50000)]

# 使用 set
start_time = time.time()
unique_set = list(set(large_list))
print(f"set 的處理時間: {time.time() - start_time:.6f} 秒")

# 使用 dict.fromkeys()
start_time = time.time()
unique_dict = list(dict.fromkeys(large_list))
print(f"dict.fromkeys() 的處理時間: {time.time() - start_time:.6f} 秒")

# 使用 OrderedDict
start_time = time.time()
unique_ordered_dict = list(OrderedDict.fromkeys(large_list))
print(f"OrderedDict 的處理時間: {time.time() - start_time:.6f} 秒")

效能測試結果範例

以下是使用超過 15 萬筆資料時的處理時間結果範例:

set 的處理時間: 0.012345 秒
dict.fromkeys() 的處理時間: 0.016789 秒
OrderedDict 的處理時間: 0.018234 秒

結果分析

  1. set
    速度最快、效率最高。適合不需要保留順序的情況。
  2. dict.fromkeys()
    稍慢於 set,但在需要保留順序時非常實用。
  3. OrderedDict
    處理速度與 dict.fromkeys() 接近,適用於需要兼容舊版 Python 的場景。

記憶體使用量比較

以下是各種方法在記憶體使用效率方面的簡單比較結果:

方法記憶體效率特點
使用 set非常適合處理大量資料。
使用 dict.fromkeys()兼具保留順序與處理效率。
使用 OrderedDict稍低適用於需要舊版 Python 相容性的情況。

如何選擇適合的方法

適合使用 set 的情況:

  • 當資料的順序不重要時
  • 想優先考慮處理速度時
  • 需要處理大型資料集時

適合使用 dict.fromkeys() 的情況:

  • 希望保留原始資料順序
  • 追求簡潔的程式碼

適合使用 OrderedDict 的情況:

  • 需要在 Python 3.6 以下版本中使用順序保持
  • 需要兼容舊系統或舊專案

實用選擇建議

根據實際需求,可參考以下建議:

  1. 重視速度的資料清理任務:使用 set
  2. 需要保留順序的資料分析:使用 dict.fromkeys()
  3. 長期運行或相容性要求高的專案:使用 OrderedDict

6. 常見問題(FAQ)

在使用 Python 移除列表重複項目的過程中,讀者可能會遇到一些常見疑問。本節將針對這些問題進行說明與解答,並提供實用的範例。

1. 為什麼使用 set 會改變順序?

因為 set 是一種「無序集合」,本身不記錄元素的插入順序。
在 Python 中,set 被設計為用來儲存唯一值,但不關注元素的排列順序。因此,若需要保留順序,建議改用 dict.fromkeys()OrderedDict

解決方案

# 使用 dict.fromkeys() 保留順序
my_list = [4, 3, 4, 2, 1]
unique_list = list(dict.fromkeys(my_list))
print(unique_list)  # 結果: [4, 3, 2, 1]

2. 可以在二維列表中保留順序並刪除重複項嗎?

可以,只要稍加處理即可。因為二維列表的元素為可變的列表,無法直接使用 set,但可以透過轉換為不可變的 tuple 來解決。

解決方案

以下是保留順序刪除二維列表中重複項的範例:

# 原始二維列表
nested_list = [[1, 2], [3, 4], [1, 2], [5, 6]]

# 保留順序地刪除重複
unique_list = []
[unique_list.append(x) for x in nested_list if x not in unique_list]
print(unique_list)  # 結果: [[1, 2], [3, 4], [5, 6]]

3. 如何有效處理大量資料的重複刪除?

對於大規模資料集,set 是最有效率的選擇。set 採用哈希表實作,可快速搜尋與儲存元素。

解決方案

# 大型資料集
large_list = [i for i in range(100000)] + [i for i in range(50000)]

# 使用 set 移除重複
unique_list = list(set(large_list))
print(len(unique_list))  # 結果: 100000(唯一元素的數量)

注意事項

  • 由於不保留順序,若順序很重要請使用其他方法。
  • 處理超大資料時,需注意記憶體使用效率。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

7. 總結

在 Python 中刪除列表中的重複項目,有多種方法可供選擇,從最簡單的方式到進階應用皆有涵蓋。每種方法都有其優缺點,選擇最適合的方法取決於你的實際需求與場景。

基本方法

使用 set 的方法 是最簡單且速度最快的方式,具備以下特點:

  • 優點:程式碼簡潔、執行速度快。
  • 缺點:無法保留原始順序。
  • 適用情境:當順序不重要或需處理大量資料時非常合適。
my_list = [1, 2, 2, 3, 4, 4]
unique_list = list(set(my_list))
print(unique_list)  # 結果: [1, 2, 3, 4]

保留順序的方法

使用 dict.fromkeys()OrderedDict 可以保留原始順序,同時刪除重複項。

  • dict.fromkeys()(適用於 Python 3.6 以上)
my_list = [4, 3, 4, 2, 1]
unique_list = list(dict.fromkeys(my_list))
print(unique_list)  # 結果: [4, 3, 2, 1]
  • OrderedDict(可用於 Python 3.5 以下版本)
from collections import OrderedDict
my_list = [4, 3, 4, 2, 1]
unique_list = list(OrderedDict.fromkeys(my_list))
print(unique_list)  # 結果: [4, 3, 2, 1]

進階方法

針對二維列表或具條件的重複刪除 等更複雜的情況,也可以透過進階技巧來處理。

  • 對於二維列表,可先轉為 tuple 使用 set 刪除後再轉回 list。
  • 對於字典組成的列表,可根據特定 key 的值進行去重處理。
# 二維列表
nested_list = [[1, 2], [3, 4], [1, 2]]
unique_list = [list(x) for x in set(tuple(x) for x in nested_list)]
print(unique_list)  # 結果: [[1, 2], [3, 4]]

# 條件式重複刪除(以 id 為依據)
data_list = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"}
]
unique_list = list({item["id"]: item for item in data_list}.values())
print(unique_list)  # 結果: [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]

效能比較

不同方法在執行效率與記憶體使用上表現不一,根據資料量與處理需求,可參考下表:

方法處理速度保留順序適用場景
使用 set最快×大量資料、順序不重要
使用 dict.fromkeys()中等需保留順序時
使用 OrderedDict中等需兼容舊版 Python 時

選擇方法的建議

  • 需要簡單快速處理:使用 set
  • 需要保留順序:使用 dict.fromkeys()OrderedDict
  • 資料結構複雜或需條件過濾:使用 tuple 轉換、字典處理等進階技巧

給讀者的建議

透過本篇文章介紹的各種方法,你可以根據資料特性與實際情境,有效地在 Python 中進行列表的重複刪除。請依需求選擇合適的方法,並應用於實際的專案或資料分析中。

希望這篇文章能對正在學習 Python 或進行列表操作的你有所幫助。如果你有任何疑問或進一步的應用案例,歡迎在下方留言或提供回饋!