天天看點

你應該學會的python清單去重方法

清單去重是寫Python時經常遇的問題,因為從别的源資料轉換成清單時,有可能不是我們預期的最終結果,最常見的就是清單中元素有重複,這時候第一件事我們就要做去重處理,我們先來個最簡單的方式,用python内置的資料類型set來實作。

假設我們的清單資料是這樣的:

level_names = [     u'Second Level',     u'First Level',     u'First Level' ]

因為集合的元素是不能重複的,是以将清單轉換成集合時,會自動去掉重複的元素,這就是基本原理,代碼如下:

>>> the_list = set(level_names) >>> print(the_list) set([u'Second Level', u'First Level'])

這種方式缺點是再轉換成清單時無法儲存之前的清單順序,如果沒這個要求,這種方式是最簡答的, 也許有的小夥伴覺得好簡單呀,這沒什麼技術含量嗎,沒錯,是以一般面試題裡讓你清單去重一般會這麼寫:

請寫出清單去重的方法(不能用set)

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

我們都知道清單可以周遊,能周遊問題也就簡單了,我們再定義空清單,然後周遊有資料的清單,再周遊時加一個判斷,如果在空清單裡沒有,就加進去,如果有了就丢掉,代碼如下:

the_list = [] for level in level_names:     if level not in the_list:         the_list.append(level) print(the_list)

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

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

the_set = set()     if level not in the_set:         the_set.add(level)