你應(yīng)該知道的python列表去重方法
前言
列表去重是寫(xiě)Python腳本時(shí)常遇問(wèn)題,因?yàn)椴还茉磾?shù)據(jù)來(lái)自哪里,當(dāng)我們轉(zhuǎn)換成列表的方式時(shí),有可能預(yù)期的結(jié)果不是我們最終的結(jié)果,最常見(jiàn)的就是列表中元素有重復(fù),這時(shí)候第一件事我們就要做去重處理。
我們先來(lái)個(gè)最簡(jiǎn)單的方式,用python內(nèi)置的數(shù)據(jù)類型set來(lái)實(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)換成集合時(shí),會(huì)自動(dòng)去掉重復(fù)的元素,這就是基本原理,代碼如下:
>>> the_list = set(level_names) >>> print(the_list) set([u'Second Level', u'First Level'])
這種方式缺點(diǎn)是再轉(zhuǎn)換成列表時(shí)無(wú)法保存之前的列表順序,如果沒(méi)這個(gè)要求,這種方式是最簡(jiǎn)答的, 也許有的小伙伴覺(jué)得好簡(jiǎn)單呀,這沒(méi)什么技術(shù)含量嗎,沒(méi)錯(cuò),所以一般面試題里讓你列表去重一般會(huì)這么寫(xiě):
請(qǐng)寫(xiě)出列表去重的方法(不能用set)
人家寫(xiě)明不能用set了,所以呢,這招有時(shí)候還不能用,那當(dāng)然也難不倒我們,我們還有其他方法。
我們都知道列表可以遍歷,能遍歷問(wèn)題也就簡(jiǎn)單了,我們?cè)俣x空列表,然后遍歷有數(shù)據(jù)的列表,再遍歷時(shí)加一個(gè)判斷,如果在空列表里沒(méi)有,就加進(jìn)去,如果有了就丟掉,代碼如下:
the_list = [] for level in level_names: if level not in the_list: the_list.append(level) print(the_list)
大家覺(jué)得這種方式是不是還可以,但這種方式對(duì)付一般的小列表是沒(méi)問(wèn)題的,但如果遇到一個(gè)超級(jí)大列表,也會(huì)力不從心,因?yàn)樵趖he_list列表變的非常大,在判斷時(shí)候會(huì)影響效率,因?yàn)榱斜硎前此饕樞蛉ゲ檎业?,?dāng)數(shù)據(jù)量很大時(shí)會(huì)變慢。
也許你要問(wèn)了,那我遇到大的列表咋辦? 有更牛掰點(diǎn)的方法嗎?當(dāng)然有,讓我們繼續(xù),既然在判斷時(shí)用列表會(huì)影響效率,那我們就轉(zhuǎn)換一個(gè)思路,我們用集合,那你可能要問(wèn)了,那集合就快了?沒(méi)錯(cuò),因?yàn)閟et使用的hash函數(shù)查找值,雖然set無(wú)序,但位置是固定的,只需一次就可以查到特定元素是否存在,網(wǎng)上有人做了列表和set的元素查找對(duì)比,相同的數(shù)據(jù)條件下,用list耗時(shí)16分鐘,用set耗時(shí)是52秒,這一對(duì)比看出效果了吧,別的不多說(shuō)了,貼代碼:
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é)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
Python繪圖Turtle庫(kù)的安裝問(wèn)題解決
這篇文章主要介紹了Python繪圖中解決Turtle的安裝問(wèn)題示例分析,也遇到過(guò)相同問(wèn)題的同學(xué)可以借鑒參考下,希望能夠解決你的問(wèn)題2021-10-10詳解Python如何精確控制asyncio并發(fā)運(yùn)行多個(gè)任務(wù)
這篇文章主要為大家詳細(xì)介紹了Python如何精確控制asyncio并發(fā)運(yùn)行多個(gè)任務(wù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10詳解Python中命令行參數(shù)argparse的常用命令
這篇文章主要為大家詳細(xì)介紹了Python中命令行參數(shù)argparse的一些常用命令,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以了解一下2023-01-01python獲取Linux下文件版本信息、公司名和產(chǎn)品名的方法
這篇文章主要介紹了python獲取Linux下文件版本信息、公司名和產(chǎn)品名的方法,主要涉及了pefile模塊的用法,需要的朋友可以參考下2014-10-1050行Python代碼實(shí)現(xiàn)人臉檢測(cè)功能
現(xiàn)在的人臉識(shí)別技術(shù)已經(jīng)得到了非常廣泛的應(yīng)用,支付領(lǐng)域、身份驗(yàn)證、美顏相機(jī)里都有它的應(yīng)用。下面小編給大家?guī)?lái)了基于50行Python代碼實(shí)現(xiàn)人臉檢測(cè)功能,一起看看吧2018-01-01Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫(kù)教程
原本感覺(jué)在Django1.7+python 2.78+pycharm環(huán)境下配置mysql數(shù)據(jù)庫(kù)是件很容易的事情,結(jié)果具體操作的時(shí)候才發(fā)現(xiàn),問(wèn)題還是挺多的,這里記錄一下最終的配置結(jié)果,給需要的小伙伴參考下吧2014-11-11Python如何優(yōu)雅的實(shí)現(xiàn)自增枚舉類
枚舉類型在編程中扮演著重要的角色,它們?yōu)樽兞抠x予了更加清晰的含義,然而,在Python中,實(shí)現(xiàn)自增的枚舉類并非直接而簡(jiǎn)單的任務(wù),本文將深入討論如何通過(guò)不同的方式優(yōu)雅地實(shí)現(xiàn)自增的枚舉類,需要的朋友可以參考下2023-12-12