python列表去重的一些方法

本文探讨了Python中去除列表重复元素的各种方法,包括利用集合、字典、枚举及索引遍历等策略,适用于不同数据类型,如整数、列表和不可散列类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做Python123平台上的列表去重题,复述题目:
去除列表中的重复元素,考虑以下几种情况:

l = [1, 1, 2, 3]
l = [[1], [1], [2], [3]]
l = [3, 2, 1, 1]

原文链接:14025
总结一下网上的方法和我自己想的方法:

  1. 不考虑列表去重之后的元素顺序
	return list(set(l))

由于集合元素的唯一性,集合可以去重,但是集合的元素是无序的,转换成列表之后原来的列表的元素顺序会变化,在评判时不通过。并且第二项还会报错

TypeError: unhashable type: 'list'

考虑到列表类型元素unhashable的问题,可以先把每个元素转换成字符串,去重之后再去掉引号

    a = [str(element) for element in l]
    b = list(set(a))
    duplicatedList =  [eval(element) for element in b]
    return duplicatedList

考虑到元素顺序问题,可以这样写(参考链接:链接

    duplicatedList.sort(key=l.index)
    return duplicatedList
列表的index函数的用法是
list.index(x[, start[, end]])
x --- 要查找的元素
start --- 查找开始的位置
end --- 查找结束的位置
sort方法的key参数的意义是主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

我的理解是,从去重之后的列表duplicatedList中取出一个元素,在l中找第一次出现的位置(索引),以这个索引为依据排序duplicatedList的元素。语法上等效于

duplicatedList.sort(key=lambda x:l.index(x))

这仅是我个人的理解,原作者没解释。如果我说的不对欢迎讨论。

  1. 使用字典的fromkeys方法,第二项报unhashable错误
    参考:链接
# fromkeys 以列表的元素作为字典的键,把所有的键都赋同样的值(如果不指定则默认赋值为None)
lst1 = []
dct = dict.fromkeys(l)
# 对字典的每一个键,字典的键是唯一的
for n in dct:
   lst1.append(n)
return lst1

或者

return list(dict.fromkeys(l))

以下三种方法对于元素unhashable的情况依然有效

枚举l的每个元素,如果没在新列表里出现,则加在新列表的末尾,否则(重复了)不追加

    new_lst = []
    for v in l:
        if v not in new_lst:
            new_lst.append(v)
    return v
  1. 使用enumerate函数枚举
    平台的官方答案之一
#更简洁的写法是
    return [value for index, value in enumerate(l) if value not in l[:index] ]
#其意义是枚举列表每个元素(设索引为index,值为value),
#如果value没有在l[0:index]中出现过(没重复)则value加入到新列表中,如果重复就不追加
#如果还是看不懂,看下面的拆解版
    r = []
    for idx, value in enumerate(l):
        if value not in l[:idx]:
            r.append(value)
    return r
  1. 基于索引遍历列表
   r = []
   for idx in range(len(l)):
       if l[idx] not in r:
       #或者if l[idx] not in l[:idx]:
           r.append(l[idx])
# 也可写作
   return [l[idx] for idx in range(len(l)) if l[idx] not in l[:idx]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值