• 删除列表中重复元素的几种方法


    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    # 版本一: 直接遍历列表删除
    for el in l1:
        if l1.count(el) > 1:
            l1.remove(el)
    print(l1)# 会漏删,因为删除一个元素后,后面的元素向前补位,导致紧跟的一个元素被跳过.
    
    # 版本二: 通过遍历索引删除
    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    for el in range(len(l1)):  # 此时len(l1)已经确定,不会随着l1后面的变化而变化
        if l1.count(l1[el]) > 1:
            l1.remove(l1[el])
    print(l1)  # 会报错,因为删除元素后导致l1的长度变短了,但是for遍历的还是之前的索引长度,会导致索引超过范围而报错
    
    # 版本三: 通过遍历创建的切片来删除原列表
    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    for el in l1[:]:
        if l1.count(el) > 1:
            l1.remove(el) # 没有问题,可以去重,但是无法保留原有的顺序
    print(l1)   
    
    # 版本四: 用新列表记录需要保留的元素
    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    lst = []
    for el in l1:
        if lst.count(el) < 1:
            lst.append(el)
    print(lst)   # 没有问题,也能保留原有顺序,但是创建了新列表
    
    # 版本五: 通过索引倒着删除
    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    for el in range(len(l1)-1, -1, -1):
        if l1.count(l1[el]) > 1:
            l1.pop(el)  # 没有问题,且保留原顺序
            # l1.remove(l1[el]) # 没有问题,但是不能保留原有顺序
            # del l1[el] # 这样则会保留原有顺序,小伙伴可以想一想为什么
    print(l1)   
    
    # 版本六: 通过递归函数删除
    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    def set_lst(lst):
        for el in lst:
            if lst.count(el) > 1:
                lst.remove(el)
                set_lst(lst)    # 每次开辟一个新函数,判断上次被删除了一个元素后的列表
        else:  # 直到最后,列表里的元素都是一个,运行了else
            return lst
    print(set_lst(l1))  # 因为是从前面开始删除的,所以不保留原有顺序
    '''
    [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    [1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    [1, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    [1, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    [1, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    [1, 3, 3, 6, 6, 5, 5, 2, 2]
    [1, 3, 6, 6, 5, 5, 2, 2]
    [1, 3, 6, 5, 5, 2, 2]
    [1, 3, 6, 5, 2, 2]
    [1, 3, 6, 5, 2]   return lst = [1, 3, 6, 5, 2]
    '''
    
    # 版本七: 毫无疑问set()是最方便的
    l1 = [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]
    lst = list(set(l1))
    print(lst)
    
  • 相关阅读:
    HTML5 localStorage and sessionStorage
    WebViewJavascriptBridge-Obj-C和JavaScript互通消息的桥梁
    js控制手机号码中间用星号代替
    无法删除登录名 '***',因为该用户当前正处于登录状态。 (Microsoft SQL Server,错误: 15434)
    在QT中添加LIB的方法
    Android颜色代码
    判断ubuntu是32位还是64位
    Android应用市场App发布
    ubuntu目录结构(转)
    QT调用CHM方法
  • 原文地址:https://www.cnblogs.com/zyyhxbs/p/11084866.html
Copyright © 2020-2023  润新知