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种方法,即空列表只追加“新”元素的办法。

目录
相关文章
|
16天前
|
索引 Python
Python列表
Python列表。
42 8
|
18天前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
30 9
|
26天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
53 14
|
28天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
40 10
|
2月前
|
数据处理 开发者 Python
Python中的列表推导式:简洁高效的数据处理
在编程世界中,效率和可读性是代码的两大支柱。Python语言以其独特的简洁性和强大的表达力,为开发者提供了众多优雅的解决方案,其中列表推导式便是一个闪耀的例子。本文将深入探讨列表推导式的使用场景、语法结构及其背后的执行逻辑,带你领略这一特性的魅力所在。
|
2月前
|
开发者 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第41天】 在编程的世界中,效率与简洁是永恒的追求。本文将深入探讨Python编程语言中一个独特且强大的特性——列表推导式(List Comprehension)。我们将通过实际代码示例,展示如何利用这一工具简化代码、提升性能,并解决常见编程问题。无论你是初学者还是资深开发者,掌握列表推导式都将使你的Python之旅更加顺畅。
|
2月前
|
Python
探索Python中的列表推导式
【10月更文挑战第38天】本文深入探讨了Python中强大而简洁的编程工具——列表推导式。从基础使用到高级技巧,我们将一步步揭示如何利用这个特性来简化代码、提高效率。你将了解到,列表推导式不仅仅是编码的快捷方式,它还能帮助我们以更加Pythonic的方式思考问题。准备好让你的Python代码变得更加优雅和高效了吗?让我们开始吧!
|
2月前
|
JavaScript 前端开发 算法
python中的列表生成式和生成器
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生的天地。通过自学前端技术2年半,现正向全栈开发迈进。如果你从我的文章中受益,欢迎关注,我将持续更新高质量内容,你的支持是我前进的动力!🎉🎉🎉
33 0
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
23 0
|
2月前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
23 0