234十 2018-12-22 14:33 采纳率: 100%
浏览 3590
已采纳

python怎么用循环删除列表中的重复数值

a=[1,2,1,4,1,]
n=a[0]
while n<len(a)+1:
if a[n]==1:
a.remove(a[n])
n=n+1
print (a)
这样写执行的结果列表最后的1删不掉

a=[1,2,1,4,1,]
n=a[0]
while n<len(a)+1:
if a[n]==1:
del a[n]
n=n+1
print (a)
判断条件下的删除改成del,最前面的1删不掉。

a=[1,2,1,4,1,]
n=a[0]
while n<len(a)+1:
if a[n]==1:
a.pop(n)
n=n+1
print (a)
把判断条件下的删除改成pop,最前面的1也是删不掉

a=[1,2,1,4,1,]
for i in a:
if i==1:
a.remove(1)
print (a)
改成for循环,又没问题

现在有个问题,就是删除重复值1,for循环配合del,pop,remove怎么写,while循环配合del,pop,remove代码又该怎么写。可能我的问题有些复杂。请原谅我是小白。希望大神不吝赐教。谢谢

  • 写回答

3条回答 默认 最新

  • _ether 2018-12-22 07:22
    关注

    首先,python中是很注重缩进的,您的排版上最好修改一下
    暂且按照现在的格式来看,第一段代码应该是这样的

    a=[1,2,1,4,1,]
    n=a[0]
    while n<len(a)+1:
        if a[n]==1:
            a.remove(a[n])
        n=n+1
    print (a)
    

    这段代码的问题在于:
    1、循环中n是作为下标使用的,但是一开始的赋值却是n = a[0],n为列表a的第0号元素(也就是第一个),即n = 1
    2、循环条件的判断n<len(a)+1,则n会取到5,但是列表的下标是从0开始,到a[5]的时候已经没有取值了循环条件的判断n<len(a)+1,则n会取到5,但是列表的下标是从0开始,到a[5]的时候已经没有取值了
    3、判断条件是a[n]==1,也就是说这个代码的作用不在于去重,而是要删除所有为1的元素判断条件是a[n]==1,也就是说这个代码的作用不在于去重,而是要删除所有为1的元素
    4、a.remove(a[n]),删除不是用下标删除而是判断删除这个值,根据上边的判断条件,这一句就相当于a.remove(1)

    这段代码看下来就是,n从1开始取值,直到5,判断列表中后四个元素是否等于1,如果等于1,则从列表中删除一个元素1,但是删除时用的取值删除,因此会从第0号元素的1开始,后四位中有两个1,因此有两次判断为True执行删除,自然删不掉最后的1
    改正:

    a=[1,2,1,4,1,]
    n=0
    while n<len(a):
        if a[n]==1:
            a.remove(a[n])
        n=n+1
    print (a)
    

    第二段代码的错误和第一段完全相同,只是删除的方法换了而已改正方法和第一段相同

    第三段代码的错误也基本一样,但是本段的a.pop(n)是利用下标删除的,所以删除的是后两个1

    最后一段没问题是因为for i in a这个语句是从头遍历的,所以判断并删除没有出现错误

    你的问题不复杂,但是基础差的太多了,而且这个代码不是一般意义上的去重,而是去掉列表中的元素1

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况