鱼C论坛

 找回密码
 立即注册
查看: 1455|回复: 11

[已解决]麻烦各位看个小问题

[复制链接]
发表于 2021-3-12 11:39:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想要实现的功能是,把列表中的字符串删掉
代码:
numbers = [1,2,2,'a','y',1]
for each in numbers:
    if type(each) == str:
        num = numbers.index(each)
        del numbers[num]
print(numbers)

为什么结果是:[1, 2, 2, 'y', 1]

如果输入的是numbers = [1,2,2,'a',1,'y']
结果是:[1, 2, 2, 1]
最佳答案
2021-3-12 11:58:22
本帖最后由 Peteryo01223 于 2021-3-12 13:32 编辑

我知道了,原因是:
  • 运行时,Python 检查到位置 [3],发现 a 是 str,就把它删了。接着从位置 [4] 继续检查。注意,删除 a 后,y 位置前移到了 [3],没被程序检查。
  • 当 numbers 中,a 和 y 被数字 1 隔开时,这个 1,也没有被程序检查。但因为,跳过的不是 str ,人看上去觉得是“对”的。其实也有隐患。
numbers = [1,2,2,'a','程序根本不检查本位置!', 1]
for each in numbers:
    if type(each) == str:
        num = numbers.index(each)
        del numbers[num]
print(numbers)
run 后结果:
============================
[1, 2, 2, '程序根本不检查本位置!', 1]
最便捷的解决方法:按3#楼鱼油说的,简单添加[:]
for each in numbers[:]:
固定你要判断的对象,即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-12 11:58:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Peteryo01223 于 2021-3-12 13:32 编辑

我知道了,原因是:
  • 运行时,Python 检查到位置 [3],发现 a 是 str,就把它删了。接着从位置 [4] 继续检查。注意,删除 a 后,y 位置前移到了 [3],没被程序检查。
  • 当 numbers 中,a 和 y 被数字 1 隔开时,这个 1,也没有被程序检查。但因为,跳过的不是 str ,人看上去觉得是“对”的。其实也有隐患。
numbers = [1,2,2,'a','程序根本不检查本位置!', 1]
for each in numbers:
    if type(each) == str:
        num = numbers.index(each)
        del numbers[num]
print(numbers)
run 后结果:
============================
[1, 2, 2, '程序根本不检查本位置!', 1]
最便捷的解决方法:按3#楼鱼油说的,简单添加[:]
for each in numbers[:]:
固定你要判断的对象,即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 11:59:20 From FishC Mobile | 显示全部楼层
numbers = [1,2,2,'a','y',1]
for each in numbers[:]:
    if type(each) == str:
        num = numbers.index(each)
        del numbers[num]
print(numbers)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 12:03:41 | 显示全部楼层
a删除后,y和1往前移动了一个index,但for循环还是执行6次,所以删除第二个的时候删除的是后面的。
所以循环对象不要在循环中改动。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 13:18:05 | 显示全部楼层
# -*- coding: utf-8 -*-

numbers = ['q', 1, 2, 2, 'a', 'y', 1, 'b']
for each in range(len(numbers) - 1, -1, -1):
    if type(numbers[each]) == str:
        del numbers[each]
print(numbers)

使用逆序访问列表中的内容就可以啦~

后面的即使被删除了,每次 for 循环前移一位,并不会受到影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 13:28:09 | 显示全部楼层
原因:
直接删除后,下一次循环的时候,会跳过当前索引

解决方案:
方法1、最简单的办法是拷贝一个列表,删除元素在拷贝列表中删
方法2、记录所有索引,一次性删除
方法3、递归,写函数,参数为列表,循环参数列表,找到后删除,将删除元素后的列表作为参数传入并调用函数。如此循环,等找不到的时候,递归结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 13:31:45 | 显示全部楼层
numbers = [1,2,2,'a','y',1]
n1 = []
for each in numbers:
    print(each)
    if type(each) == str:
        n1.append(each)
print(n1)
for i in range(0,len(n1)):
    numbers.remove(n1[i])
print(numbers)
解释就是上边那样,先记录,然后删除也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 14:41:06 | 显示全部楼层
我记得这么干会报错的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 15:13:34 | 显示全部楼层
给你推荐个代码,我自己在用的
usernumber = str(input("输入一个值:"))
char = []
for i,number in enumerate(usernumber):
    if number.isdigit() == True:
        char.insert(i,number)
char = ''.join(char)
print(char)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-12 15:43:21 | 显示全部楼层
Peteryo01223 发表于 2021-3-12 11:58
我知道了,原因是:
  • 运行时,Python 检查到位置 [3],发现 a 是 str,就把它删了。接着从位置 [4] 继 ...

  • 麻烦再问一下您 如果修改成:for each in numbers[:]  意思就是每次执行这个循环,列表都会被重新拷贝,然后再从第一个元素开始重新进行判断对嘛?
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

    发表于 2021-3-12 15:57:05 | 显示全部楼层
    本帖最后由 Peteryo01223 于 2021-3-12 16:16 编辑
    dandan0523 发表于 2021-3-12 15:43
    麻烦再问一下您 如果修改成:for each in numbers[:]  意思就是每次执行这个循环,列表都会被重新拷贝, ...


    使用 [ : ] 切片,可以浅拷贝整个 numbers 列表。那么
    for each in numbers[:]  
    通过这句code,你让 Python 有了一个确定的对象,此对象不随 for 循环而有改变的机会。相当于给一排嫌疑犯们,照了一张照片,然后你看着照片,一一核对谁有问题。他们在照片上,没办法换位置,你的排查过程,就能做到“不漏掉任何一个”。

    当然,大家又提出很多其他方法,也都行得通,思路不一样,体会体会,每种方法都有各自的价值。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2021-3-12 15:59:10 | 显示全部楼层
    小伤口 发表于 2021-3-12 11:59
    numbers = [1,2,2,'a','y',1]
    for each in numbers[:]:
        if type(each) == str:

    谢谢您!
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

    GMT+8, 2025-1-16 07:49

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表