Python中,删除列表中包含某个数的所有元素

常见问题和错误

错误代码:

def Wrong():
    print(f'Function runing');

    mm = input("please input the number you wanner delete:\n")
    num = list(range(98, 122))
    for i in num:
        m = i
        while m != 0:
            x = m% 10
            if x == int(mm):   #注意input的返回值是字符串类型,即使输入的是数字,也无法直接和数字比较
                num.remove(i)
                break
            m = int(m/10)   #此处必须取整否则会出现小数情况,而导致%运算混乱

    print(num)

if __name__ == "__main__":
	Wrong()

运行结果:

Function runing
please input the number you wanner delete:
1
[99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121]

Process finished with exit code 0

以上代码在执行时会由于列表发生变化,从而导致循环混乱,此处想具体观察列表变化和调试可以通过将列表调小,加入一些print语句来显示特定值或列表的方式。

测试代码:

def Wrong():
    print(f'Function runing');

    mm = input("please input the number you wanner delete:\n")
    num = list(range(9, 12))
    for i in num:
        m = i
        while m != 0:
            x = m % 10
            if x == int(mm):
                num.remove(i)
                break
            m = int(m/10);
    print(num)

if __name__ == "__main__":
	Wrong()

输出结果:

Function runing
please input the number you wanner delete:
1
[9, 11]

Process finished with exit code 0

分析
使用print语句看清具体值,以及列表的变化

def Wrong():
    print(f'Function runing');

    mm = input("please input the number you wanner delete:\n")
    num = list(range(9, 12))
    for i in num:
        m = i
        print(f'The start {num}')
        print(f'The start {m}')
        while m != 0:
            x = m % 10
            if x == int(mm):
                num.remove(i)
                break
            m = int(m/10);
            print(f'm= {m}')
        print(f'The last {num}')

    print(num)
if __name__ == "__main__":
	Wrong()

结果显示:

Function runing
please input the number you wanner delete:
1
The start [9, 10, 11]
The start 9
m= 0
The last [9, 10, 11]
The start [9, 10, 11]
The start 10
m= 1
The last [9, 11]
[9, 11]

Process finished with exit code 0

由此可见当删除第一个元素后,由于for 循环还保持着原先顺序,但是列表已经改变,从而导致循环无法进行,就以上代码而言,当i=10时,列表中删除之后,循环本应进行到原本10的后面的数,但10被删除后,后一个数就相当于向前移动了一位,可以把列表看做座位的集合,而for循环中i就相当于访问每一个座位,10被删除后,本来最后一个座位上的是11,但由于前一位上的数被删除了,所以自然就成了那个位上的数。当for走到11的位子上时,则会显示此位上无数,因此停止循环。

正解

for循环思路

def num_list():

    num = list(range(98,122))
    figure = [] #一个空列表,来装除删除元素之外的所有数

    mm = input("please input the number you wanner delete:\n")
    for i in num:
        m = i
        flag = 0    #作为标记作用
        while m != 0:
            x = m % 10
            if x != int(mm):
                flag += 1

            else:
                flag = 0  #一旦出现要求删除的数,马上标记清零,然后退出循环。
                break
            m = int(m / 10)
        if flag != 0:   #由于前面else语句,如果是要删除的数,flag一定为0
            figure.append(i)
    print(figure)

运行结果


please input the number you wanner delete:
1
[98, 99]

Process finished with exit code 0;

具体原理:
由于for循环的删除效果不行,所以采取另外一个思想,就是不对列表本身采取任何措施,把有用的取出来,放到其他地方。
如果该数符合我的条件,就会进入另外列表,若不符则留在原来列表,而题目要求删除包含某个值的数,而我采用把不包含某个值的数放入另一个列表了。

while 循环思路

def while_list():
    mm = input("please input the number you wanner delete:\n")
    num = list(range(99, 122))
    i = 0
    while i <= len(num) -1:
        m = num[i]
        print('j')   #单独一个分隔标记
        print(num)
        while m != 0:
            x = m % 10
            if x == int(mm):
                num.remove(num[i])
                i = i-1
                break
            m = int(m / 10) #此处必须取整,否则出现小数会导致循环混乱,同时此处语句主要作用是取出其除开x的其他数字
        i += 1
    print(f'The last is {num}')

运行结果:

please input the number you wanner delete:
1
j
[99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 115, 116, 117, 118, 119, 120, 121]
j
[99, 116, 117, 118, 119, 120, 121]
j
[99, 117, 118, 119, 120, 121]
j
[99, 118, 119, 120, 121]
j
[99, 119, 120, 121]
j
[99, 120, 121]
j
[99, 121]
The last is [99]

此处更能看清列表中内存变化和数字变化,当然在for 循环中也可嵌入while种处理方式。此处就不细说了,想了解的小伙伴,也可结合以上两个方式,去敲敲代码

简单比较for 与 while

while方便对列表中每一位元素的处理,而for 循环处理时,由于本身特性,相当于遍历所有元素。
平常运用中for 循环更适用于已经明确个数的列表等集合。while也可用于明确个数的列表,但更多时候用于不明个数列表,或者变化的列表。

以上均为个人见解,多有不周之处,敬请见谅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taco_HUA_James

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值