列表去重

前言

列表去重是寫Python腳本時常遇問題,因為不管源數(shù)據(jù)來自哪里,當(dāng)我們轉(zhuǎn)換成列表的方式時,有可能預(yù)期的結(jié)果不是我們最終的結(jié)果,最常見的就是列表中元素有重復(fù),這時候第一件事我們就要做去重處理。

我們先來個最簡單的方式,用python內(nèi)置的數(shù)據(jù)類型set來實現(xiàn)。

假設(shè)我們的列表數(shù)據(jù)是這樣的:

l_names =[

?u'Second Level',

?u'Second Level',

?u'Second Level',

?u'First Level',

?u'First Level'

]

因為集合的元素是不能重復(fù)的,所以將列表轉(zhuǎn)換成集合時,會自動去掉重復(fù)的元素,這就是基本原理,代碼如下:

>>> the_list =set(level_names)

>>> print(the_list)

set([u'Second Level', u'First Level'])

這種方式缺點是再轉(zhuǎn)換成列表時無法保存之前的列表順序,如果沒這個要求,這種方式是最簡答的, 也許有的小伙伴覺得好簡單呀,這沒什么技術(shù)含量嗎,沒錯,所以一般面試題里讓你列表去重一般會這么寫:

請寫出列表去重的方法(不能用set)

人家寫明不能用set了,所以呢,這招有時候還不能用,那當(dāng)然也難不倒我們,我們還有其他方法。

我們都知道列表可以遍歷,能遍歷問題也就簡單了,我們再定義空列表,然后遍歷有數(shù)據(jù)的列表,再遍歷時加一個判斷,如果在空列表里沒有,就加進去,如果有了就丟掉,代碼如下:

the_list =[]

forlevel inlevel_names:

?iflevel notinthe_list:

??the_list.append(level)

print(the_list)

大家覺得這種方式是不是還可以,但這種方式對付一般的小列表是沒問題的,但如果遇到一個超級大列表,也會力不從心,因為在the_list列表變的非常大,在判斷時候會影響效率,因為列表是按索引順序去查找的,當(dāng)數(shù)據(jù)量很大時會變慢。

也許你要問了,那我遇到大的列表咋辦? 有更牛掰點的方法嗎?當(dāng)然有,讓我們繼續(xù),既然在判斷時用列表會影響效率,那我們就轉(zhuǎn)換一個思路,我們用集合,那你可能要問了,那集合就快了?沒錯,因為set使用的hash函數(shù)查找值,雖然set無序,但位置是固定的,只需一次就可以查到特定元素是否存在,網(wǎng)上有人做了列表和set的元素查找對比,相同的數(shù)據(jù)條件下,用list耗時16分鐘,用set耗時是52秒,這一對比看出效果了吧,別的不多說了,貼代碼:

list =[]

the_set =set()

forlevel inlevel_names:

?iflevel notinthe_set:

??the_set.add(level)

??the_list.append(level)

print(the_list)

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


python列表元素去重后如何保持原來的順序不變

? ? 原列表:

list1 =?[1,2,1,4,9,3,5,2,6,7,3,1,6,8,4,0]

去重,使用集合set來去重:

list2 = list(set(list1)

set去重得到的list2默認按升序進行排序:

list2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使list2按照list1元素出現(xiàn)的順序進行排序(也就是原來的順序):

list2.sort(key = list1.index)

此時,list2 =?[1, 2, 4, 9, 3, 5, 6, 7, 8, 0]


>>> l=[9,0,1,2,3,3,4,5,6,45,67,77,6,45,8]

>>> ll=list(set(l))

>>> ll.sort(key=l.index)

>>> ll

[9, 0, 1, 2, 3, 4, 5, 6, 45, 67, 77, 8]


?>>> s="abcdabcd1234uiopppl"

>>> ss=set(s)

>>> ss=list(set(s))

>>> ss.sort(key=s.index)

>>> ss

['a', 'b', 'c', 'd', '1', '2', '3', '4', 'u', 'i', 'o', 'p', 'l']

>>> print ''.join(ss)

abcd1234uiopl

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容