Python列表去重的六種方法及對比詳解
引言:為什么列表去重如此重要?
在數(shù)據(jù)處理、日志分析、爬蟲去重等場景中,列表去重幾乎是每個開發(fā)者都會遇到的挑戰(zhàn)。但面對不同的數(shù)據(jù)類型(可哈希/不可哈希)和需求(保留順序/高效執(zhí)行),如何選擇最優(yōu)方案?
本文將系統(tǒng)解析6種Python列表去重方法,涵蓋基礎實現(xiàn)與進階技巧,并通過性能測試與實戰(zhàn)案例,助你徹底掌握這一核心技能!
基礎篇:可哈希元素的去重方法
1. 集合去重法(Set)
原理:利用集合自動去重的特性。
優(yōu)點:時間復雜度 O(n),效率最高。
缺點:破壞原始順序,僅適用于可哈希元素(如整數(shù)、字符串)。
li = [11, 22, 44, 33, 33, 22, 22, 11] res = list(set(li)) print(res) # 輸出可能為 [33, 11, 44, 22](順序隨機)
適用場景:快速去重且無需保留順序,如臨時數(shù)據(jù)清洗。
2. 字典去重法(Python 3.7+)
原理:利用字典鍵的唯一性,且Python 3.7+后字典有序。
優(yōu)點:時間復雜度 O(n),兼顧效率與順序。
li = [11, 22, 44, 33, 33, 22, 22, 11] unique_list = list(dict.fromkeys(li)) print(unique_list) # 輸出 [11, 22, 44, 33]
3. 新建列表法
原理:逐個添加不重復元素至新列表。
優(yōu)點:保留順序,邏輯簡單。
缺點:時間復雜度 O(n²),不適用于大數(shù)據(jù)量。
li = [11, 22, 44, 33, 33, 22, 22, 11] unique_list = [] for i in li: if i not in unique_list: # 每次檢查需遍歷新列表 unique_list.append(i) print(unique_list) # 輸出 [11, 22, 44, 33]
適用場景:小規(guī)模數(shù)據(jù)且需簡單實現(xiàn)的場景。
4. 遍歷刪除法
原理:遍歷原列表副本,刪除重復項。
優(yōu)點:保留順序。
缺點:時間復雜度 O(n²),性能較差。
li = [11, 22, 44, 33, 33, 22, 22, 11] unique_list = li.copy() for i in li.copy(): while unique_list.count(i) > 1: # 頻繁遍歷和刪除 unique_list.remove(i) print(unique_list) # 輸出 [11, 22, 44, 33]
注意事項:避免在遍歷時直接修改原列表,否則可能引發(fā)IndexError
。
進階篇:不可哈希元素的去重方法
5. JSON序列化去重(字典/嵌套列表)
原理:將字典序列化為字符串,利用集合去重。
適用場景:需完整內(nèi)容去重的不可哈希元素(如字典)。
import json def deduplicate_dicts_by_content(dict_list): seen = set() unique_dicts = [] for d in dict_list: dict_str = json.dumps(d, sort_keys=True) # 保證鍵順序一致 if dict_str not in seen: seen.add(dict_str) unique_dicts.append(d) return unique_dicts # 測試用例:去重內(nèi)容相同的字典 li_dicts = [{"a": 1}, {"a": 1}, {"b": 2}, {"a": 1, "b": 2}, {"b": 2, "a": 1}] print(deduplicate_dicts_by_content(li_dicts)) # 輸出前兩個重復項被去重
關(guān)鍵點:sort_keys=True
確保鍵順序一致,避免因順序不同導致誤判。
6. 特定鍵值去重(如根據(jù)ID去重)
原理:根據(jù)字典的某個鍵(如ID)的值進行去重。
適用場景:業(yè)務中存在唯一標識符(如用戶ID、訂單號)。
def deduplicate_dicts_by_key(dict_list, key): seen = set() unique_dicts = [] for d in dict_list: if key not in d: unique_dicts.append(d) # 不包含鍵則保留(按需調(diào)整) continue if d[key] not in seen: seen.add(d[key]) unique_dicts.append(d) return unique_dicts # 測試用例:根據(jù)鍵"a"去重 li_dicts = [{"a": 1}, {"a": 1}, {"b": 2}, {"a": 3}] print(deduplicate_dicts_by_key(li_dicts, "a")) # 保留第一個{"a":1}和{"a":3}
擴展應用:支持多鍵組合去重,如key=("user_id", "timestamp")
。
性能對比與選型指南
通過實際測試對比各方法的執(zhí)行效率(以10萬條數(shù)據(jù)為例):
方法 | 時間復雜度 | 保留順序 | 適用場景 | 10萬數(shù)據(jù)耗時 |
---|---|---|---|---|
集合去重 | O(n) | ? | 快速去重,無需順序 | 0.002秒 |
字典去重(Python3.7+) | O(n) | ? | 高效且需順序 | 0.003秒 |
JSON序列化 | O(n) | ? | 不可哈希元素(如字典) | 0.5秒 |
新建列表法 | O(n²) | ? | 小數(shù)據(jù)量 | 12.8秒 |
遍歷刪除法 | O(n²) | ? | 極少量數(shù)據(jù) | 15.4秒 |
選型建議:
- 大數(shù)據(jù)量+可哈希元素:優(yōu)先選擇字典去重法(Python 3.7+)。
- 不可哈希元素:使用JSON序列化或特定鍵去重。
- 臨時快速去重:集合去重法。
- 小數(shù)據(jù)量+保留順序:新建列表法。
實戰(zhàn)場景解析
場景1:電商訂單去重
假設有一批訂單數(shù)據(jù),需根據(jù)order_id
去重:
orders = [ {"order_id": "A1001", "product": "Phone"}, {"order_id": "A1001", "product": "Laptop"}, # 重復訂單 {"order_id": "A1002", "product": "Tablet"} ] unique_orders = deduplicate_dicts_by_key(orders, "order_id") print(unique_orders) # 保留第一個A1001和A1002
場景2:日志分析去重
處理服務器日志時,需根據(jù)IP和時間戳去重:
def deduplicate_logs(logs): seen = set() unique_logs = [] for log in logs: identifier = (log["ip"], log["timestamp"]) # 組合鍵 if identifier not in seen: seen.add(identifier) unique_logs.append(log) return unique_logs
總結(jié)與擴展
核心總結(jié):
- 可哈希元素優(yōu)先選擇集合或字典去重。
- 不可哈希元素需依賴序列化或業(yè)務鍵去重。
- 避免在大數(shù)據(jù)中使用時間復雜度為O(n²)的方法。
擴展思考:
- 如何實現(xiàn)多條件去重(如同時根據(jù)用戶ID和時間范圍)?
- 分布式環(huán)境下如何高效去重(如使用Redis集合)?
以上就是Python列表去重的六種方法及對比詳解的詳細內(nèi)容,更多關(guān)于Python列表去重的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Linux系統(tǒng)上安裝Python的Scrapy框架的教程
這篇文章主要介紹了在Linux系統(tǒng)上安裝Python的Scrapy框架的教程,Scrapy是著名的專門針對搜索引擎的爬蟲制作而研發(fā)的Python框架,需要的朋友可以參考下2015-06-06Python中函數(shù)的參數(shù)傳遞與可變長參數(shù)介紹
這篇文章主要介紹了Python中函數(shù)的參數(shù)傳遞與可變長參數(shù)介紹,本文分別給出多個代碼實例來講解多種多樣的函數(shù)參數(shù),需要的朋友可以參考下2015-06-06keras讀取訓練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解
這篇文章主要介紹了keras讀取訓練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法
這篇文章主要給大家介紹了關(guān)于Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09python?使用第三方庫requests-toolbelt?上傳文件流的示例
這篇文章主要介紹了python?使用第三方庫requests-toolbelt?上傳文件流,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09