dandan0523 发表于 2021-3-12 11:39:00

麻烦各位看个小问题

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

为什么结果是:

如果输入的是numbers =
结果是:

Peteryo01223 发表于 2021-3-12 11:58:22

本帖最后由 Peteryo01223 于 2021-3-12 13:32 编辑

我知道了,原因是:

[*]运行时,Python 检查到位置 ,发现 a 是 str,就把它删了。接着从位置 继续检查。注意,删除 a 后,y 位置前移到了 ,没被程序检查。
[*]当 numbers 中,a 和 y 被数字 1 隔开时,这个 1,也没有被程序检查。但因为,跳过的不是 str ,人看上去觉得是“对”的。其实也有隐患。
numbers =
for each in numbers:
    if type(each) == str:
      num = numbers.index(each)
      del numbers
print(numbers)
run 后结果:
============================

最便捷的解决方法:按3#楼鱼油说的,简单添加[:]
for each in numbers[:]:
固定你要判断的对象,即可。

小伤口 发表于 2021-3-12 11:59:20

numbers =
for each in numbers[:]:
    if type(each) == str:
      num = numbers.index(each)
      del numbers
print(numbers)

suchocolate 发表于 2021-3-12 12:03:41

a删除后,y和1往前移动了一个index,但for循环还是执行6次,所以删除第二个的时候删除的是后面的。
所以循环对象不要在循环中改动。

Daniel_Zhang 发表于 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) == str:
      del numbers
print(numbers)


使用逆序访问列表中的内容就可以啦~{:10_254:}

后面的即使被删除了,每次 for 循环前移一位,并不会受到影响

笨鸟学飞 发表于 2021-3-12 13:28:09

原因:
直接删除后,下一次循环的时候,会跳过当前索引

解决方案:
方法1、最简单的办法是拷贝一个列表,删除元素在拷贝列表中删
方法2、记录所有索引,一次性删除
方法3、递归,写函数,参数为列表,循环参数列表,找到后删除,将删除元素后的列表作为参数传入并调用函数。如此循环,等找不到的时候,递归结束

yuedong 发表于 2021-3-12 13:31:45


numbers =
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)
print(numbers)

解释就是上边那样,先记录,然后删除也可以

nahongyan1997 发表于 2021-3-12 14:41:06

我记得这么干会报错的啊

唯爱丶雪 发表于 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)

dandan0523 发表于 2021-3-12 15:43:21

Peteryo01223 发表于 2021-3-12 11:58
我知道了,原因是:

[*]运行时,Python 检查到位置 ,发现 a 是 str,就把它删了。接着从位置 继 ...

麻烦再问一下您 如果修改成:for each in numbers[:]意思就是每次执行这个循环,列表都会被重新拷贝,然后再从第一个元素开始重新进行判断对嘛?

Peteryo01223 发表于 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 循环而有改变的机会。相当于给一排嫌疑犯们,照了一张照片,然后你看着照片,一一核对谁有问题。他们在照片上,没办法换位置,你的排查过程,就能做到“不漏掉任何一个”。

当然,大家又提出很多其他方法,也都行得通,思路不一样,体会体会,每种方法都有各自的价值。

dandan0523 发表于 2021-3-12 15:59:10

小伤口 发表于 2021-3-12 11:59
numbers =
for each in numbers[:]:
    if type(each) == str:


谢谢您!
页: [1]
查看完整版本: 麻烦各位看个小问题