Python列表去重复项的N种方法(实例代码)


Posted in Python onMay 12, 2020

说明

Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,Python List可支持各种数据类型,长度也可动态调整,与JS中的数组或Java ArrayList很接近。在实际编程中,经常会遇到数组或列表去掉重复项,保持成员唯一性。实现方式有多种,比如新建列表来存储非重复项,或者在原有基础上删除掉重复的项,也可以利用数据结构来达到去重复。具体哪一种方法更好呢?以下约20种方式都可以实现,我们可以通过这些来交流和学习。

Python列表去重复项的N种方法(实例代码)

方式

## 1. 新建列表,如果新列表中不存在,则添加到新列表。 
def unique(data): 
 new_list = [] 
 for item in data: 
 if item not in new_list: 
  new_list.append(item) 
 return new_list 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("new_list + not in data:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
# result 
$ python -V 
Python 2.7.16 
$ python unique.py 
('for list + not in. data:', ['a', 1, 2, 'b']) 
time:0.0441074371338 ms 
## 2. 新建列表。根据下标判断是否存在新列表中,如果新列表中不存在则添加到新列表。 
def unique(data): 
 new_list = [] 
 for i in range(len(data)): 
 if data[i] not in new_list: 
  new_list.append(data[i]) 
 return new_list 
## 2.1 新建列表,使用列表推导来去重。是前一种的简写。 
def unique(data): 
 new_list = [] 
 [new_list.append(i) for i in data if not i in new_list] 
 return new_list 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("for range + not in. data:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 3. 通过index找不到该项,则追加到新列表中。index找不到会报错,因此放在异常处理里。 
def unique(data): 
 new_list = [] 
 for i in range(len(data)): 
 item = data[i] 
 try: 
  if (new_list.index(item) < 0): 
  print('new_list:', new_list) 
 except ValueError: 
  new_list.append(item) 
 return new_list 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("list index + except:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 4. 新建列表,两个循环。如果内循环与外循环项相同,且下标相同就添加到新列表,其余忽略 
def unique(data): 
 new_list = [] 
 for i in range(len(data)): 
 j = 0 
 while j <= i: 
  if data[i] == data[j]: 
  if i == j: 
   new_list.append(data[i]) 
  break 
  j += 1 
 return new_list 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("new list + for. new_list:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 5. 在原有列表上移除重复项目。自后往前遍历,逐个与前面项比较,如果值相同且下标相同,则移除当前项。 
def unique(data): 
 l = len(data) 
 while (l > 0): 
 l -= 1 
 i = l 
 while i > 0: 
  i -= 1 
  if data[i] == data[l]: 
  del data[l] 
  break 
 return data 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("one list while. last -> first result. data:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 6. 在原有列表上移除重复项目。自前往后遍历,逐个与后面项比较,如果值相同且下标相同,则移除当前项。 
def unique(data): 
 l = len(data) 
 i = 0 
 while i < l: 
 j = i + 1 
 while j < l: 
  if data[i] == data[j]: 
  del data[j] 
  l -= 1 
  i -= 1 
  break 
  j += 1 
 i += 1 
 return data 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("one list while. first -> last result. data:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 7. 新建列表。遍历列表,利用index比较出现的位置,如果出现在第一次的位置则追加到新数组。 
def unique(data): 
 new_list = [] 
 for i in range(len(data)): 
 if i == data.index(data[i]): 
  new_list.append(data[i]) 
 return new_list 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("for range + index. data:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 8. 利用字典属性唯一性来实现去重复。 
def unique(data): 
 obj = {} 
 for item in data: 
 obj[item] = item 
 return obj.values() 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("list + dict:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 或者直接通过dict.fromkeys来实现 
print("dict fromkeys:", dict.fromkeys(data).keys()) 
## 9. 利用filter函数,即把不符合条件的过滤掉。这里filter不支持下标,因此需要借助外部列表存储不重复项 
def uniq(item): 
 i = data.index(item) 
 if (item not in new_list): 
 new_list.append(item) 
 return True 
 return False 
def unique(item): 
 if obj.get(item) == None: 
 obj[item] = item 
 return True 
 return False 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
new_list = [] 
print('filter + list + not in: ', filter(uniq, data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 10. 利用字典结合过滤来实现去重复。 
def unique(item): 
 if obj.get(item) == None: 
 obj[item] = item 
 return True 
 return False 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
obj = {} 
print("filter + dict + get:", filter(unique, data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 11. 利用map来实现去重复。与map与filter类似,是一个高阶函数。可以针对其中项逐个修改操作。 
## 与filter不同map会保留原有项目,并不会删除,因此值可以改为None,然后再过滤掉。 
def unique(item): 
 if item not in new_list: 
 new_list.append(item) 
 return item 
 return None 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
new_list = [] 
start_time = time.time() 
print("list from Map:", filter(lambda item: item != None, map(unique, data))) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 12. 利用set数据结构里key的唯一性来去重复 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
print("from Set:", list(set(data))) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 13. 提前排序,从后向前遍历,将当前项与前一项对比,如果重复则移除当前项 
def unique(data): 
 data.sort() 
 l = len(data) 
 while (l > 0): 
 l -= 1 
 if (data[l] == data[l - 1]): 
  data.remove(data[l]) 
 return data 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("sort + remove:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 14. 提前排序,自前往后遍历,将当前项与后一项对比,如果重复则移除当前项 
def unique(data): 
 """ 
 in python 3: TypeError: '<' not supported between instances of 'int' and 'str' 
 need to keep the same Type of member in List 
 """ 
 data.sort() 
 l = len(data) - 1 
 i = 0 
 while i < l: 
 if (data[i] == data[i + 1]): 
  del data[i] 
  i -= 1 
  l -= 1 
 i += 1 
 return data 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("sort+del ASE:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 15. 利用reduce函数来去重复。reduce具有累计的作用,判断如果不在累计结果中出现,则追加到结果中。 
import functools 
def unique(data): 
 new_list = [] 
 def foo(result, item): 
 if isinstance(result, list) == False: 
  result = [result] 
 return result if item in result else result + [item] 
 return functools.reduce(foo, data) 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("functools.reduce:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 16. 利用递归调用来去重复。递归自后往前逐个调用,当长度为1时终止。 
## 当后一项与前任一项相同说明有重复,则删除当前项。相当于利用自我调用来替换循环 
def recursion_unique(data, len): 
 if (len <= 1): 
 return data 
 l = len 
 last = l - 1 
 is_repeat = False 
 while (l > 1): 
 l -= 1 
 if (data[last] == data[l - 1]): 
  is_repeat = True 
  break 
 if (is_repeat): 
 del data[last] 
 return recursion_unique(data, len - 1) 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("recursion_unique:", recursion_unique(data, len(data))) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 17. 利用递归调用来去重复的另外一种方式。递归自后往前逐个调用,当长度为1时终止。 
## 与上一个递归不同,这里将不重复的项目作为结果拼接起来 
def recursion_unique_new(data, len): 
 if (len <= 1): 
 return data 
 l = len 
 last = l - 1 
 is_repeat = False 
 while (l > 1): 
 l -= 1 
 if (data[last] == data[l - 1]): 
  is_repeat = True 
  break 
 if (is_repeat): 
 del data[last:] 
 result = [] 
 else: 
 result = [data[last]] 
 return recursion_unique_new(data, len - 1) + result 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("recursion_unique_new:", recursion_unique_new(data, len(data))) 
print("time:" + str((time.time() - start_time) * 1000) + " ms") 
## 18. 利用numpy lib库. 需提前安装 `pip install numpy` 
import numpy as np 
def unique(data): 
 res = np.array(data) 
 return list(np.unique(res)) 
# test 
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1] 
start_time = time.time() 
print("import numpy as np.unique:", unique(data)) 
print("time:" + str((time.time() - start_time) * 1000) + " ms")
Python列表去重复项的N种方法(实例代码)

讨论

从以上例子上可以看出,相对来讲,Python比起其它语言要灵活得多,与JS并列最流行的脚本类语言,这也就是为何Python如此流行的原因吧。

哪一种方式更适合呢?你常用那种方式来实现去重复项?新建数组、非新建、借助Dict或Set等结构,亦或是其它方式?

Python列表去重复项的N种方法(实例代码)

总结

到此这篇关于Python列表去重复项的N种方法的文章就介绍到这了,更多相关python列表去重复项内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现调用其他python脚本的方法
Oct 05 Python
Python获取文件ssdeep值的方法
Oct 05 Python
python超简单解决约瑟夫环问题
May 12 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
python爬取指定微信公众号文章
Dec 20 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
python实现简单俄罗斯方块
Mar 13 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 #Python
Pycharm激活方法及详细教程(详细且实用)
May 12 #Python
PyTorch在Windows环境搭建的方法步骤
May 12 #Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 #Python
pycharm 激活码及使用方式的详细教程
May 12 #Python
Python-jenkins模块之folder相关操作介绍
May 12 #Python
使用python-Jenkins批量创建及修改jobs操作
May 12 #Python
You might like
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
python实现多线程采集的2个代码例子
2014/07/07 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
详解Python字典的操作
2019/03/04 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
python学生管理系统的实现
2020/04/05 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
统计员岗位职责
2013/11/14 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
干部行政关系介绍信
2014/01/17 职场文书
初中生评语大全
2014/04/24 职场文书
导师推荐信范文
2014/05/09 职场文书
和睦家庭事迹
2014/05/14 职场文书
拉贝日记观后感
2015/06/05 职场文书
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers