目次
1. 為什麼需要在 Python 中移除列表的重複項目?
在 Python 中移除列表中的重複項目在許多情況下都非常重要。特別是在處理大量資料時,為了確保資料的唯一性並進行高效的處理,這是一項不可或缺的操作。需要刪除重複項目的原因
- 提升資料分析的準確性 在資料分析中,如果包含重複的資料,可能會導致結果不準確。例如,在統計銷售數據或問卷結果時,重複項可能會導致錯誤的結論。
- 與資料庫整合 當使用 Python 將資料匯入資料庫時,如果唯一鍵重複,會產生錯誤。事先使用 Python 移除重複項目,可以讓資料處理流程更加順利。
- 提高處理效率 資料過於龐大會對記憶體與處理時間造成負擔。特別是在處理大量資料時,移除重複可以有效改善整體系統效能。
常見的重複刪除使用情境
- 資料清理:整理從網頁爬蟲取得的資料時。
- 重複檢測:例如商品庫存清單或用戶註冊資訊的重複確認。
- 列表操作:需要在特定的列表處理中刪除重複資料時。
本文的目的
本篇文章將介紹如何使用 Python 移除列表中的重複項目,從基礎方法到進階技巧都有所涵蓋。內容適合初學者,並包含保留順序與效能優化的方法,幫助讀者根據自身需求選擇最適合的方式。Ad
2. 使用 set 移除列表中的重複項目
在 Python 中,最基本的重複刪除方法就是使用set。set 是 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](重複的2和4已被移除)
set,可以自動移除重複元素。接著再使用 list() 函數將 set 轉換回列表。使用 set 的優點
- 簡單直觀 程式碼簡潔明瞭,初學者也能輕鬆理解。
- 處理速度快 由於
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 轉換成列表,即可保留順序。
優點
- 順序得以保留 在保留原始順序的同時完成重複刪除。
- 程式碼簡潔 只需一行即可完成重複刪除與順序保持。
缺點
- 若對字典的運作原理不熟悉,初學者可能會覺得有點困難。
使用 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 中都能穩定運作。優點
- 高度相容性 即使在 Python 3.6 以下版本也能保留順序。
- 穩定可靠 專為順序保持而設計,更具可預測性。
缺點
- 需要匯入標準函式庫。
- 相較於
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適合需要高相容性或特定環境下使用。
適合使用這些方法的情境
- 當需要保留原始順序時。
- 希望同時完成順序保持與重複刪除。
- 考慮 Python 版本或未來相容性時。
Ad
4. 進階的列表重複刪除技巧
有些情況下,基本的重複刪除方法無法處理更複雜的資料結構,例如二維列表或條件式的刪除。在這一節,我們將介紹如何處理這些進階情況。5. 性能比較
在 Python 中移除列表重複項目的方法不同,處理速度與記憶體使用量也會有所差異。本節將比較幾種常見方法的性能表現,並探討適用的場景。比較對象與評估標準
比較的方法包括:- 使用
set的方法 - 使用
dict.fromkeys()的方法 - 使用
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 秒結果分析
set速度最快、效率最高。適合不需要保留順序的情況。dict.fromkeys()稍慢於set,但在需要保留順序時非常實用。OrderedDict處理速度與dict.fromkeys()接近,適用於需要兼容舊版 Python 的場景。
記憶體使用量比較
以下是各種方法在記憶體使用效率方面的簡單比較結果:| 方法 | 記憶體效率 | 特點 |
|---|---|---|
使用 set | 高 | 非常適合處理大量資料。 |
使用 dict.fromkeys() | 中 | 兼具保留順序與處理效率。 |
使用 OrderedDict | 稍低 | 適用於需要舊版 Python 相容性的情況。 |
如何選擇適合的方法
適合使用set 的情況:- 當資料的順序不重要時
- 想優先考慮處理速度時
- 需要處理大型資料集時
dict.fromkeys() 的情況:- 希望保留原始資料順序
- 追求簡潔的程式碼
OrderedDict 的情況:- 需要在 Python 3.6 以下版本中使用順序保持
- 需要兼容舊系統或舊專案
實用選擇建議
根據實際需求,可參考以下建議:- 重視速度的資料清理任務:使用
set - 需要保留順序的資料分析:使用
dict.fromkeys() - 長期運行或相容性要求高的專案:使用
OrderedDict
Ad
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(唯一元素的數量)注意事項
- 由於不保留順序,若順序很重要請使用其他方法。
- 處理超大資料時,需注意記憶體使用效率。
Ad
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 轉換、字典處理等進階技巧



