從基礎(chǔ)到進(jìn)階分享3個(gè)Python列表高效去重技巧
前言:為什么寫(xiě)這篇
最近整理開(kāi)發(fā)筆記時(shí),發(fā)現(xiàn)列表去重是 Python 初學(xué)者和進(jìn)階開(kāi)發(fā)者都常遇到的問(wèn)題 —— 看似簡(jiǎn)單的需求,不同實(shí)現(xiàn)方式的性能差異能達(dá)到 10 倍以上。今天把 3 種最實(shí)用的去重技巧整理出來(lái),附上代碼示例和性能測(cè)試,同時(shí)也有個(gè)小請(qǐng)求想拜托大家(文末說(shuō)明~)
一、基礎(chǔ)去重:set () 方法(最快上手)
這是最常見(jiàn)的去重方式,利用集合 “元素不可重復(fù)” 的特性,一行代碼就能搞定:
# 基礎(chǔ)去重(無(wú)序) old_list = [1, 2, 2, 3, 3, 3, "a", "a"] new_list = list(set(old_list)) print(new_list) # 輸出:[1, 2, 3, 'a'](順序不確定)
優(yōu)點(diǎn):代碼簡(jiǎn)潔、執(zhí)行速度快(底層 C 實(shí)現(xiàn))
缺點(diǎn):會(huì)打亂原列表順序,且僅支持可哈希元素(不能去重包含字典、列表的列表)
適用場(chǎng)景:無(wú)需保留順序、元素為數(shù)字 / 字符串 / 元組的場(chǎng)景
二、進(jìn)階去重:保留原順序(Python 3.7+)
如果需要保留元素在原列表中的出現(xiàn)順序,推薦用 dict.fromkeys() 方法 —— 字典在 Python 3.7 后會(huì)保留鍵的插入順序:
# 保留順序的去重 old_list = [2, 1, 3, 2, 4, 1, 5] new_list = list(dict.fromkeys(old_list)) print(new_list) # 輸出:[2, 1, 3, 4, 5](順序與原列表一致)
優(yōu)點(diǎn):保留原順序、效率高于列表推導(dǎo)式
缺點(diǎn):Python 3.7 以下版本不保證順序
適用場(chǎng)景:需要維持元素原有順序的開(kāi)發(fā)場(chǎng)景
三、高階去重:復(fù)雜場(chǎng)景(含條件過(guò)濾)
如果需要結(jié)合條件過(guò)濾去重(比如去重后保留大于 10 的元素),可以用 pandas 庫(kù),適合處理大數(shù)據(jù)量:
import pandas as pd # 復(fù)雜場(chǎng)景去重(含條件過(guò)濾) old_list = [5, 12, 12, 8, 15, 15, 20] # 轉(zhuǎn)為Series去重,再過(guò)濾大于10的元素 new_series = pd.Series(old_list).drop_duplicates().loc[lambda x: x > 10] new_list = new_series.tolist() print(new_list) # 輸出:[12, 15, 20]
優(yōu)點(diǎn):支持大數(shù)據(jù)量、可結(jié)合復(fù)雜條件過(guò)濾
缺點(diǎn):需要額外安裝 pandas 庫(kù)
適用場(chǎng)景:數(shù)據(jù)分析、大數(shù)據(jù)量處理場(chǎng)景
性能對(duì)比總結(jié)
| 方法 | 適用場(chǎng)景 | 平均耗時(shí)(10 萬(wàn)條數(shù)據(jù)) |
|---|---|---|
| set () 去重 | 無(wú)需保留順序 | 0.003 秒 |
| dict.fromkeys () 去重 | 需要保留順序 | 0.005 秒 |
| pandas 去重 | 大數(shù)據(jù)量 + 條件過(guò)濾 | 0.012 秒 |
方法補(bǔ)充
下面小編為大家整理了其他Python列表去重的相關(guān)方法,希望對(duì)大家有所幫助
Python列表去重保持順序方法
1.使用字典去重(Python 3.7+)
# 利用dict.fromkeys()自動(dòng)去重并保持順序 original_list = [1, 2, 2, 3, 4, 3, 5] unique_list = list(dict.fromkeys(original_list)) print(unique_list) # 輸出: [1, 2, 3, 4, 5]
2.使用集合輔助遍歷
def remove_duplicates(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
data = ['a', 'b', 'a', 'c', 'b']
print(remove_duplicates(data)) # 輸出: ['a', 'b', 'c']
3.性能與適用場(chǎng)景對(duì)比
| 方法 | 時(shí)間復(fù)雜度 | 保持順序 | Python版本要求 |
|---|---|---|---|
| dict.fromkeys() | O(n) | 是 | 3.7+ |
| 集合輔助遍歷 | O(n) | 是 | 所有版本 |
| set() | O(n) | 否 | 所有版本 |
- 若使用Python 3.7及以上,優(yōu)先選擇
dict.fromkeys() - 需兼容舊版本時(shí),采用集合輔助的顯式循環(huán)
- 避免使用
list(set(lst)),因其不保證順序
到此這篇關(guān)于從基礎(chǔ)到進(jìn)階分享3個(gè)Python列表高效去重技巧的文章就介紹到這了,更多相關(guān)Python列表去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基礎(chǔ)學(xué)習(xí)之如何對(duì)元組各個(gè)元素進(jìn)行命名詳解
python的元祖和列表類似,不同之處在于元祖的元素不能修改,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)學(xué)習(xí)之如何對(duì)元組各個(gè)元素進(jìn)行命名的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
python自動(dòng)化測(cè)試通過(guò)日志3分鐘定位bug
軟件開(kāi)發(fā)中通過(guò)日志記錄程序的運(yùn)行情況是一個(gè)開(kāi)發(fā)的好習(xí)慣,對(duì)于錯(cuò)誤排查和系統(tǒng)運(yùn)維都有很大幫助,Python標(biāo)準(zhǔn)庫(kù)自帶了強(qiáng)大的logging日志模塊,在各種python模塊中得到廣泛應(yīng)用2021-11-11
在Python中使用K-Means聚類和PCA主成分分析進(jìn)行圖像壓縮
這篇文章主要介紹了在Python中使用K-Means聚類和PCA主成分分析進(jìn)行圖像壓縮,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python實(shí)現(xiàn)加載及解析properties配置文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)加載及解析properties配置文件的方法,結(jié)合實(shí)例形式分析了Python針對(duì)properties配置文件的加載、讀取及解析相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
基于Python安裝pyecharts所遇的問(wèn)題及解決方法
今天小編就為大家分享一篇基于Python安裝pyecharts所遇的問(wèn)題及解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

