列表去重

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

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,既不需要安装新的模块,而且高效。

posted @ 2024-08-17 22:19  wancy  阅读(16)  评论(0编辑  收藏  举报