前言
列表去重是寫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