列表去重

wancy發表於2024-08-17

  列表去重方法有很多,主要方法如下:

1. set去重

#方法1. set 去重
list01=[1,1,0,0,1,2,2,4,3,3,3]
result_list=list(set(list01))
print(result_list)#[0, 1, 2, 3, 4]

  優點:簡單高效,程式碼量少,效能好。
  缺點:可能會改變原始資料的順序。

2. 列表推導式

#方法2.列表推導式
list02=[1,1,0,0,1,2,2,4,3,3,3]
result_list2 = []
[result_list2.append(x) for x in list02 if x not in result_list2]
print(result_list2)#[1, 0, 2, 4, 3]

  優點:保留了原始順序
  缺點:效率較低,尤其是列表很大的時候。時間複雜度是 O(n^2)

3. collections.Counter

#方法3.用 collections.Counter
from collections import Counter
list03=[1,1,0,0,1,2,2,4,3,3,3]
# print("Counter(list03)",Counter(list03))#Counter({1: 3, 3: 3, 0: 2, 2: 2, 4: 1})
result_list3=list(Counter(list03).keys())
print(result_list3)#[1, 0, 2, 4, 3]

  優點:保留原始順序,效率高,一行程式碼搞定。
  缺點:需要引入 collections 模組,不過這個模組是標準庫的一部分,不用擔心額外安裝問題.

4. dict.fromkeys

#方法4:用 dict.fromkeys #Python 3.7+中,字典是有序的
list04=[1,1,0,0,1,2,2,4,3,3,3]
result_list4=list(dict.fromkeys(list04))
print(result_list4)#[1, 0, 2, 4, 3]

  優點:保留原始順序,效率高。
  缺點:可能不太直觀,需要知道字典有序的特性。

5. pandas.unique(list).tolist()

#方法5:用pandas
import pandas as pd
list05=[1,1,0,0,1,2,2,4,3,3,3]
result_list5=pd.unique(list05).tolist()
print(result_list5)#[1, 0, 2, 4, 3]

  優點:保留原始順序,程式碼簡潔。
  缺點:需要引入 pandas 庫,適合已經在使用 pandas 的場景。

6. numpy.unique(list).tolist()

#方法6:用numpy
import numpy as np
list06=[1,1,0,0,1,2,2,4,3,3,3]
result_list6=np.unique(list06).tolist()
print(result_list6)#[0, 1, 2, 3, 4]

  優點:程式碼簡潔,適合數值計算
  缺點:需要引入 numpy 庫,適合已經在使用 numpy 的場景,可能會改變原始資料的順序

7. itertools.groupby

#方法7:itertools.groupby
from itertools import groupby
list07=[1,1,0,0,1,2,2,4,3,3,3]
sorted_list = sorted(list07)
result_list7 = [key for key, _ in groupby(sorted_list)]
print(result_list7)#[0, 1, 2, 3, 4]

  優點:適用於排序後的資料,效能較好。
  缺點:
排序的時間複雜度為 O(n log n),不適用於無序列表與大列表

8. pandas.Series(list).drop_duplicates().tolist()

#方法8:pandas.Series(list).drop_duplicates().tolist()
import pandas as pd
list08 = [1,1,0,0,1,2,2,4,3,3,3]
result_list8 = pd.Series(list08).drop_duplicates().tolist()
print(result_list8)#[1, 0, 2, 4, 3]

  優點: 程式碼簡潔,易於理解和實現。適用於無序的資料列表,不需要排序。
  缺點:需要匯入 pandas 庫,可能增加額外的依賴。對非常大的列表可能效能較差。

小結: 需要保留原始順序或不關心順序推薦使用collections.Counter,既不需要安裝新的模組,而且高效。

相關文章