Python 关于“列表去重”的几点小技巧

简介: Python 关于“列表去重”的几点小技巧

1. 最常见的去重方法是:先转集合再转回列表


1)set()函数

1. >>> nums = [-1, 0, 2, -1, 3, 1, 0, 1, 2]
2. >>> list(set(nums))
3. [0, 1, 2, 3, -1]


缺点:返回结果的元素顺序与原列表不一致

可以用.sort() 或 sorted()排序,改正到原列表顺序

1. >>> sorted(list(set(nums)),key=nums.index)
2. [-1, 0, 2, 3, 1]
3. >>>


2) 字典内置方法 dict.fromkeys(),不用额外再排序

>>> nums = [-1, 0, 2, -1, 3, 1, 0, 1, 2]
>>> list(dict.fromkeys(nums))
[-1, 0, 2, 3, 1]
>>>
>>> # 也可以用 空{}前导的写法
>>> {}.fromkeys(nums)
{-1: None, 0: None, 2: None, 3: None, 1: None}
>>> list({}.fromkeys(nums))
[-1, 0, 2, 3, 1]


3)前两种方法的共同缺点:当源列表包括 unhashable 类型元素时都无法工作

>>> nums = [-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> list(set(nums))
Traceback (most recent call last):
  File "<pyshell#222>", line 1, in <module>
    list(set(nums))
TypeError: unhashable type: 'list'
>>> {}.fromkeys(nums)
Traceback (most recent call last):
  File "<pyshell#223>", line 1, in <module>
    {}.fromkeys(nums)
TypeError: unhashable type: 'list'
>>> 


2. 直接删除del重复元素,遍历源列表用.count(n)计数,>1即有重复

>>> nums = [-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> t = nums[:]
>>> # 此处如用 t = nums ,nums也会被修改,最后一步的 t==nums 将返回True
>>> for n in t:
  while t.count(n)>1:
    del t[t.index(n)]
>>> sorted(t,key=nums.index)
[-1, 0, 2, 3, 1, [1, 2]]
>>>
>>> t == nums
False
>>> 


或者如下从尾部向前删就不用另外排序:

>>> nums = [-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> t = nums[::-1]
>>> for i in nums:
  if nums.count(i)>1:
    del nums[-t.index(i)-1]
>>> nums
[-1, 0, 2, 3, 1, [1, 2]]
>>> 


3. 列表list.remove()方法

>>> nums = [-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> t = nums[:]
>>> for i in t:
  while t.count(i)>1:
    t.remove(i)
>>> t.sort(key=nums.index)
>>> t
[-1, 0, 2, 3, 1, [1, 2]]
>>> 


4. 新建空列表,通过遍历源列表,只添加新列表中没有的元素:

>>> nums = [-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> tmp = []
>>> for n in nums:
  if n not in tmp:
    tmp.append(n)
>>> tmp
[-1, 0, 2, 3, 1, [1, 2]]
>>> 


5. functools.reduce()方法


>>> from functools import reduce
>>> nums = [-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> reduce(lambda x,y:x if y in x else x + [y],[[],]+nums)
[-1, 0, 2, 3, 1, [1, 2]]
>>> nums
[-1, 0, 2, -1, 3, 1, 0, [1, 2]]
>>> 


6. itertools.groupby()方法,也不适合有unhashable类型元素的列表

>>> from itertools import groupby
>>> nums = [-1, 0, 2, -1, 3, 0, 1, 2]
>>> t = sorted(nums)
>>> res = []
>>> for i,n in groupby(t):
  res.append(i)
>>> sorted(res, key=nums.index)
[-1, 0, 2, 3, 1]

注:groupby()分组时,同值元素相邻才会分在同组,所以要先排序sorted()

groupby()方法拓展:先建一个源列表元素出现次数的字典,再根据字典来删重复元素

>>> nums = [-1, 0, 2, -1, 0, 3, 1, 0, 1, 2]
>>> count = {i:len([*n]) for i,n in groupby(sorted(nums))}
>>> count
{-1: 2, 0: 3, 1: 2, 2: 2, 3: 1}
>>> res = nums[:]
>>> for i in m.keys():
  for j in range(m[i]-1):
    res.remove(i)
>>> sorted(res, key=nums.index)
[-1, 0, 2, 3, 1]
>>> 

注:有点多此一举,因为同款字典这样写更方便:{i:nums.count(i) for i in nums}


总结:


在不包含unhashable类型元素的情况下,列表去重用 dict.fromkeys() 最优;

否则用第4种方法,即空列表只追加“新”元素的办法。

目录
相关文章
|
15天前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
71 1
|
15天前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
113 0
|
15天前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
206 0
|
12天前
|
开发者 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
263 116
|
12天前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
229 119
|
18天前
|
Python
Python列表推导式:优雅与效率的艺术
Python列表推导式:优雅与效率的艺术
179 99
|
18天前
|
数据处理 Python
解锁Python列表推导式:优雅与效率的完美融合
解锁Python列表推导式:优雅与效率的完美融合
164 99
|
12天前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
|
7天前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
62 1
|
12天前
|
大数据 开发者 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术

推荐镜像

更多