python 原始列表直接去重的方法

本文探讨了Python中列表去重的两种方法:一种是通过新建列表并利用if not in语句实现;另一种是在原列表上直接去重。后者通过反转列表并在发现重复项时从后向前删除,提高了去重效率。

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

python 的列表去重在许多程序中都有使用,一般如将list1中的重复项去除的方法是新建一个空列表list2然后用if not in 语句去重如:

list1=['hello','world','hello',3.14,3]
list2=[]
for i in list1:
    if not i in list2:
       list2.append(i)

这样得到的list2就是去重后的list1

今晚突发奇想,想到是不是可以用什么方法在原列表上直接去重,想了一下写了这样的代码:

list=['hello','world',3.14,1,'hello','good','world',1,3.14]
print list
for i in list:
    a=list.count(i)
    print i,a
    if a>1:
        for k in range(1,a):
            list.remove(i)        
print list

run了下:
执行结果

发现1没有去重。依次检查发现遍列列表时居然有漏掉的,分析后发现:

(1)列表的迭代其实是以列表中项的序列号来遍列的,当删除其中某一项时,它之后的每一项的序列号各往前移一项

(2)当遍列列表时,发现0项是重复项,于是将其移除。当移除0项时,原来的1项变0项,原来2项变1项,依次类推。此时列表迭代由1开始(0项已过),但此时的1项是原列表的2项,这样就漏掉原列表的1项。由此可见列表的迭代是按序列号来迭代的,不会因列表的改变而变化,永远都是按0,1,2,3……..来的
(3)根据1,2两点我想到将列表反转来进行删除操作,其本质就是当发现某项具有重复项时,就从后往前删除。比如迭代0项发现1项是它的重复项,那么就删除1项,删除1项后2项变成1项,而此时列表迭代正则到了1项。从原始列表的角度上来说,就跳过了1项。但是它却不影响去重,因为它跳过的是重复项。列表的不重复迭代反而使去重效率更高且不会漏掉不重复项。因此原始列表直接去重的核心问题不是迭代的漏项,而迭代不能漏掉不重复项。

list=['hello','world',3.14,1,'hello','good','world',1,3.14]
print list
for i in list:
    a=list.count(i)
    print i,a
    if a>1:
        list.reverse()
        for k in range(1,a):
            list.remove(i)
        list.reverse()
print list

run 一下:
结果

经测式后发现列表中1和True,0和False是用count检测出来的结果是重复的要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值