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

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条)

报告相同问题?

悬赏问题

  • ¥15 爬虫保存的scv文件0kb
  • ¥20 如何实现基于强化学习的带电作业机械臂的运动规划与控制
  • ¥15 使用wpf制作打砖块游戏时遇到的一个Bug
  • ¥15 qrCodeDetector.detectAndDecode
  • ¥15 海洋可控源和大地电磁一维联合反演
  • ¥15 MFC多文档程序获取视图指针问题
  • ¥20 解体如何编写程序还有运行结果截图
  • ¥15 如何把matlabR2023遗传算法工具箱里面的各类选项对应的代码调出来呢?
  • ¥30 MDIGetActive() 获取活动view
  • ¥15 有数据,如何安装使用CLIP模型检索图片