你應(yīng)該知道的python列表去重方法
前言
列表去重是寫Python腳本時常遇問題,因?yàn)椴还茉磾?shù)據(jù)來自哪里,當(dāng)我們轉(zhuǎn)換成列表的方式時,有可能預(yù)期的結(jié)果不是我們最終的結(jié)果,最常見的就是列表中元素有重復(fù),這時候第一件事我們就要做去重處理。
我們先來個最簡單的方式,用python內(nèi)置的數(shù)據(jù)類型set來實(shí)現(xiàn)。
假設(shè)我們的列表數(shù)據(jù)是這樣的:
level_names = [ u'Second Level', u'Second Level', u'Second Level', u'First Level', u'First Level' ]
因?yàn)榧系脑厥遣荒苤貜?fù)的,所以將列表轉(zhuǎn)換成集合時,會自動去掉重復(fù)的元素,這就是基本原理,代碼如下:
>>> the_list = set(level_names) >>> print(the_list) set([u'Second Level', u'First Level'])
這種方式缺點(diǎn)是再轉(zhuǎn)換成列表時無法保存之前的列表順序,如果沒這個要求,這種方式是最簡答的, 也許有的小伙伴覺得好簡單呀,這沒什么技術(shù)含量嗎,沒錯,所以一般面試題里讓你列表去重一般會這么寫:
請寫出列表去重的方法(不能用set)
人家寫明不能用set了,所以呢,這招有時候還不能用,那當(dāng)然也難不倒我們,我們還有其他方法。
我們都知道列表可以遍歷,能遍歷問題也就簡單了,我們再定義空列表,然后遍歷有數(shù)據(jù)的列表,再遍歷時加一個判斷,如果在空列表里沒有,就加進(jìn)去,如果有了就丟掉,代碼如下:
the_list = [] for level in level_names: if level not in the_list: the_list.append(level) print(the_list)
大家覺得這種方式是不是還可以,但這種方式對付一般的小列表是沒問題的,但如果遇到一個超級大列表,也會力不從心,因?yàn)樵趖he_list列表變的非常大,在判斷時候會影響效率,因?yàn)榱斜硎前此饕樞蛉ゲ檎业?,?dāng)數(shù)據(jù)量很大時會變慢。
也許你要問了,那我遇到大的列表咋辦? 有更牛掰點(diǎn)的方法嗎?當(dāng)然有,讓我們繼續(xù),既然在判斷時用列表會影響效率,那我們就轉(zhuǎn)換一個思路,我們用集合,那你可能要問了,那集合就快了?沒錯,因?yàn)閟et使用的hash函數(shù)查找值,雖然set無序,但位置是固定的,只需一次就可以查到特定元素是否存在,網(wǎng)上有人做了列表和set的元素查找對比,相同的數(shù)據(jù)條件下,用list耗時16分鐘,用set耗時是52秒,這一對比看出效果了吧,別的不多說了,貼代碼:
the_list = [] the_set = set() for level in level_names: if level not in the_set: the_set.add(level) the_list.append(level) print(the_list)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
解決Ubuntu pip 安裝 mysql-python包出錯的問題
今天小編就為大家分享一篇解決Ubuntu pip 安裝 mysql-python包出錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Django 在iframe里跳轉(zhuǎn)頂層url的例子
今天小編就為大家分享一篇Django 在iframe里跳轉(zhuǎn)頂層url的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python基于多線程實(shí)現(xiàn)ping掃描功能示例
這篇文章主要介紹了Python基于多線程實(shí)現(xiàn)ping掃描功能,結(jié)合實(shí)例形式分析了Python多線程與進(jìn)程相關(guān)模塊調(diào)用操作技巧,需要的朋友可以參考下2018-07-07
Pandas之StyleFrame如何設(shè)置表格樣式
這篇文章主要介紹了Pandas之StyleFrame如何設(shè)置表格樣式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
python爬蟲反爬之圖片驗(yàn)證功能實(shí)現(xiàn)
這篇文章主要介紹了python爬蟲反爬之圖片驗(yàn)證功能實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
Python實(shí)現(xiàn)批量提取Excel數(shù)據(jù)
在數(shù)據(jù)處理和分析的過程中,Excel 是一種廣泛使用的數(shù)據(jù)存儲格式,本文將詳細(xì)介紹如何使用 pandas、openpyxl 和 xlrd 三種庫來批量提取 Excel 數(shù)據(jù),并提供相應(yīng)的示例代碼,需要的可以參考下2024-12-12
Python多進(jìn)程庫multiprocessing中進(jìn)程池Pool類的使用詳解
這篇文章主要介紹了Python多進(jìn)程庫multiprocessing中進(jìn)程池Pool類的使用詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
spark dataframe 將一列展開,把該列所有值都變成新列的方法
今天小編就為大家分享一篇spark dataframe 將一列展開,把該列所有值都變成新列的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python dataclass 快速創(chuàng)建數(shù)據(jù)類的方法
在Python中,dataclass是一種用于快速創(chuàng)建數(shù)據(jù)類的裝飾器和工具,本文實(shí)例代碼中我們定義了一個Person數(shù)據(jù)類,并使用fields()函數(shù)遍歷其字段,打印出每個字段的名稱、類型、默認(rèn)值和元數(shù)據(jù),對python dataclass 數(shù)據(jù)類相關(guān)知識感興趣的朋友一起看看吧2024-03-03

