您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python列表去重复项的N种方法

时间:2020-05-03 14:27:03  来源:  作者:

随着人工智能的发展,Python变得越来越流行了。而Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,但Python List可支持各种数据类型,长度也可动态调整,与JS中的数组或JAVA ArrayList很接近。在实际编程中,我们会遇到数组或列表去掉重复项的需求。那么在Python编程中,我们会有很多种方法来实现这个目标,有的新建列表来存储非重复项,有的则在原有基础上删除掉重复的项,有的则利用数据结构来达到去重复的目的。具体哪一种方法更好呢?只能说根据不同场景来选择一种,以下的N种方式将有助于对于基础算法和语言学习的理解。

Python列表去重复项的N种方法

 

方式

## 1. 新建列表,如果新列表中不存在,则添加到新列表
def unique(data):
    newList = []
    for item in data:
        if item not in newList:
            newList.Append(item)
    print("for list + not in. data:", newList)

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
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):
    newList = []
    for i in range(len(data)):
        if data[i] not in newList:
            newList.append(data[i])
    return newList

# 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):
    newList = []
    for i in range(len(data)):
        item = data[i]
        try:
            if (newList.index(item) < 0):
                print('newList:', newList)
        except ValueError:
            newList.append(item)
    return newList

# 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):
    newList = []
    for i in range(len(data)):
        j = 0
        while j < i:
            j += 1
            if data[i] == data[j]:
                if (i == j):
                    newList.append(data[i])
                break
    return newList

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("new list + for. newList:", 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):
    newList = []
    for i in range(len(data)):
        if i == data.index(data[i]):
            newList.append(data[i])
    return newList

# 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")
## 9. 利用filter函数,即把不符合条件的过滤掉。这里filter不支持下标,因此需要借助外部列表存储不重复项
def uniq(item):
    i = data.index(item)
    if (item not in newList):
        newList.append(item)
        return True
    return False


# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
newList = []
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 newList:
        newList.append(item)
        return item
    return None


# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
newList = []
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:", 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):
    newList = []

    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 recursionUnique(data, len):
    if (len <= 1):
        return data

    l = len
    last = l - 1
    isRepeat = False

    while (l > 1):
        l -= 1
        if (data[last] == data[l - 1]):
            isRepeat = True
            break

    if (isRepeat):
        del data[last]

    return recursionUnique(data, len - 1)

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("recursionUnique:", recursionUnique(data, len(data)))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
## 17. 利用递归调用来去重复的另外一种方式。递归自后往前逐个调用,当长度为1时终止。
## 与上一个递归不同,这里将不重复的项目作为结果拼接起来
def recursionUniqueNew(data, len):
    if (len <= 1):
        return data

    l = len
    last = l - 1
    isRepeat = False
    while (l > 1):
        l -= 1
        if (data[last] == data[l - 1]):
            isRepeat = True
            break

    if (isRepeat):
        del data[last:]
        result = []
    else:
        result = [data[last]]

    return recursionUniqueNew(data, len - 1) + result

# test
data = ['a', 'a', 1, 1, 2, 2, 'b', 'b', 2, 1]
start_time = time.time()
print("recursionUniqueNew:", recursionUniqueNew(data, len(data)))
print("time:" + str((time.time() - start_time) * 1000) + " ms")
Python列表去重复项的N种方法

 

讨论

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

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

Python列表去重复项的N种方法

 



Tags:Python列表   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景今天双十一,昨晚有好多电商行业的 IT 工程师们挑灯夜战,为这个全民狂欢的购物节护航。还记得三年前我们公司一个产品上线前一周时,办公室内拉起“跟 Bug 死扛到底”的横幅,B...【详细内容】
2020-11-11  Tags: Python列表  点击:(65)  评论:(0)  加入收藏
前面的课程,我们讲解了 Python 语言的学习方法,并且带你了解了 Python 必知的常用工具&mdash;&mdash;Jupyter。那么从这节课开始,我们将正式学习 Python 的具体知识。对于每一...【详细内容】
2020-05-28  Tags: Python列表  点击:(56)  评论:(0)  加入收藏
随着人工智能的发展,Python变得越来越流行了。而Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,但Python List可支持各种数据类型,长度也可动态...【详细内容】
2020-05-03  Tags: Python列表  点击:(39)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  菜鸟学python    Tags:Python4   点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  风度翩翩的Python    Tags:Python   点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(8)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(8)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条