1. 程式人生 > >【Python進階】刪除list裡的重複元素的三種方法效率分析

【Python進階】刪除list裡的重複元素的三種方法效率分析

1. sorted(...)

    sorted(iterable, key=None, reverse=False) --> new sorted list      eg.  sorted(l, key = l.index),生成一個新的了list, 原list不變


2. sort(...)
    L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*   eg. l.sort(key = l.index), 返回一個新的list給原來的list

3. index(...)
    L.index(value, [start, [stop]]) -> integer -- return first index of value.   返回第一個value所在的index
    Raises ValueError if the value is not present.

4. pop(...)
    L.pop([index]) -> item -- remove and return item at index (default last).  remove引數index指向的value,返回的是value
    Raises IndexError if list is empty or index is out of range.

5.remove(...)
    L.remove(value) -> None -- remove first occurrence of value.   remove第一個value, 返回none
    Raises ValueError if the value is not present.

6. if  __name__ = '__main__'的作用:

模組是物件,並且所有的模組都有一個內建屬性__name__,它的值取決於模組是如何應用的。如果import了這個模組,__name__通常為模組檔名,不帶路徑

或者副檔名。如果不import,像一個標準程式一樣執行這個模組,__name__的值將是一個特別預設的”__main__“

方法一:將列表排序後,從最後一個元素開始迴圈迭代列表,判斷相鄰的兩個元素是否相等

有賦值,排序操作。由於Pyhton變數也是物件,中每迭代出一個與last_item不相等的元素後,都重新建立一個區域性變數並丟棄原來的變數,需要消耗更多記憶體。

而且由於排序操作,相對位置被破壞了。

def sort_one(list):
    list.sort()
    length = len(list)
    last_item = list[length -1 ]
    for i in range(len(list) - 2, -1, -1):
        if last_item == list[i]:
            list.remove(last_item)
        else:
            last_item = list[i]

if __name__ == '__main__':
    sort_one(a)
    print(a)
方法二: 建立一個臨時列表,迭代迴圈出的元素如果不在臨時列表裡,就將其加入臨時列表,最後返回臨時列表

每次旨在原來的列表上增加一個索引和值,相比方法一效率更高

def sort_two(list):
    list.sort()
    temp_list = []
    for value in list:
        if value not in temp_list:
            temp_list.append(value)
    return temp_list
    
if __name__ == '__main__':
    print(sort_two(a))


方法三:效率最高,使用set,好處是快速,壞處是打亂了列表的順序,需要重新sort

def sort_three(list):
    new_list = sorted(set(list))
    return new_list
   
if __name__ == '__main__':
    print(sort_three(a))