欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python列表去重的六種方法及對比詳解

 更新時間:2025年06月25日 09:43:35   作者:python_chai  
在數(shù)據(jù)處理、日志分析、爬蟲去重等場景中,列表去重幾乎是每個開發(fā)者都會遇到的挑戰(zhàn),本文將系統(tǒng)解析6種Python列表去重方法,涵蓋基礎實現(xiàn)與進階技巧,需要的朋友可以參考下

引言:為什么列表去重如此重要?

在數(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)文章

  • Python實現(xiàn)時間序列變化點檢測功能

    Python實現(xiàn)時間序列變化點檢測功能

    平穩(wěn)性是時間序列分析與預測的核心概念,在平穩(wěn)條件下,時間序列的統(tǒng)計特性(如均值)在時間維度上保持不變,僅存在隨機波動,但是時間序列通常會經(jīng)歷結(jié)構(gòu)性斷裂或變化,本文給大家介紹了Python實現(xiàn)時間序列變化點檢測功能,需要的朋友可以參考下
    2024-09-09
  • 在Linux系統(tǒng)上安裝Python的Scrapy框架的教程

    在Linux系統(tǒng)上安裝Python的Scrapy框架的教程

    這篇文章主要介紹了在Linux系統(tǒng)上安裝Python的Scrapy框架的教程,Scrapy是著名的專門針對搜索引擎的爬蟲制作而研發(fā)的Python框架,需要的朋友可以參考下
    2015-06-06
  • python3.x提取中文的正則表達式示例代碼

    python3.x提取中文的正則表達式示例代碼

    這篇文章主要介紹了python3.x中提取中文的正則表達式的書寫,需要的朋友可以參考下
    2019-07-07
  • Python中函數(shù)的參數(shù)傳遞與可變長參數(shù)介紹

    Python中函數(shù)的參數(shù)傳遞與可變長參數(shù)介紹

    這篇文章主要介紹了Python中函數(shù)的參數(shù)傳遞與可變長參數(shù)介紹,本文分別給出多個代碼實例來講解多種多樣的函數(shù)參數(shù),需要的朋友可以參考下
    2015-06-06
  • Python簡單爬蟲導出CSV文件的實例講解

    Python簡單爬蟲導出CSV文件的實例講解

    今天小編就為大家分享一篇Python簡單爬蟲導出CSV文件的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • keras讀取訓練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解

    keras讀取訓練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解

    這篇文章主要介紹了keras讀取訓練好的模型參數(shù)并把參數(shù)賦值給其它模型詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python 畫出來六維圖

    Python 畫出來六維圖

    這篇文章主要介紹了Python 畫出來六維圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • numpy 產(chǎn)生隨機數(shù)的幾種方法

    numpy 產(chǎn)生隨機數(shù)的幾種方法

    本文主要介紹了numpy 產(chǎn)生隨機數(shù)的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法

    Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法

    這篇文章主要給大家介紹了關(guān)于Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • python?使用第三方庫requests-toolbelt?上傳文件流的示例

    python?使用第三方庫requests-toolbelt?上傳文件流的示例

    這篇文章主要介紹了python?使用第三方庫requests-toolbelt?上傳文件流,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論